home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / stufiles.c < prev    next >
C/C++ Source or Header  |  1996-05-27  |  101KB  |  4,441 lines

  1. /*
  2.  * StuFiles.c
  3.  *
  4.  * Purpose:
  5.  * --------
  6.  * Op‚rations DIRECTEMENT en relation avec les fichiers:
  7.  *    init des chemins du file selector
  8.  *    controle d'extension .???
  9.  *
  10.  * History:
  11.  * --------
  12.  * 1993: fplanque: Created
  13.  */
  14.  
  15.  
  16.      #include "!OPTIONS.H"                /* Options de compilation */         
  17.     #define    THIS_FILE    "STUFILES.C v1.20 - 03.95"
  18.           
  19.  
  20. /*
  21.  * System headers:
  22.  */
  23.     #include    <stdio.h>                    /* header standard */
  24.     #include    <stdlib.h>                    /* header librairie de fnct std */
  25.     #include <string.h>                    /* header tt de chaines */
  26.     #include    <ext.h>                        /* header fonctions ‚tendues */
  27.     #include    <tos.h>                        /* Header fonctions TOS */
  28.     #include    <aes.h>                        /* header AES */
  29.     #include <vdi.h>                        /* header VDI */
  30.    
  31.  
  32. /*
  33.  * Custom headers:
  34.  */
  35.     #include    "SPEC_PU.H"                    /* Listes */
  36.     #include "S_MALLOC.H"
  37.     #include    "DEBUG_PU.H"    
  38.     #include    "DBSYS_PU.H"    
  39.     #include    "ARBPG_PU.H"    
  40.     #include    "ARPAR_PU.H"    
  41.     #include    "ATREE_PU.H"    
  42.     #include    "LISTS_PU.H"    
  43.     #include    "FILES_PU.H"    
  44.     #include    "RTERR_PU.H"    
  45.     #include    "DTDIR_PU.H"    
  46.     #include    "DATPG_PU.H"    
  47.     #include    "TEXT_PU.H"    
  48.     #include "ARBKEYPU.H"
  49.     #include    "GEMDIRPU.H"
  50.  
  51. /*
  52.  * Mode d'enregistrement:
  53.  */
  54. typedef
  55.     enum
  56.     {
  57.         FEMODE_SINGLE,            /* Objet sauv‚ ds fichier … part */
  58.         FEMODE_INTEGRATED        /* Objet int‚gr‚ ds fichier avec d'autres */
  59.     }
  60.     FEMODE;
  61.  
  62. typedef
  63.     enum
  64.     {
  65.         SERIALIZE_INPUTFPAR,
  66.         SERIALIZE_OUTPUTFPAR    
  67.     }
  68.     SERIALIZE_TYPE;
  69.  
  70. /*
  71.  * ------------------------ PROTOTYPES -------------------------
  72.  */
  73.  
  74.  
  75. /*
  76.  * EXTernal prototypes:
  77.  */
  78.     /* 
  79.      * Datas: 
  80.      */
  81.     extern    void    init_serv( void );
  82.     /*
  83.      * desktop
  84.      */
  85.     extern    DATAGROUP    *    find_datagroup_byType(         /* Out: Ptr sur datagroup */
  86.                                     DATATYPE        DataType );        /* In:  Type DTYP_* */
  87.     /* 
  88.      * Config: 
  89.      */
  90.     extern    void    save_infdata( FILE *fstream );
  91.     extern    void    save_inf( FILE *fstream );
  92.     extern    void    load_inf( FILE *fstream );
  93.     extern    void    save_inidata( FILE *fstream );
  94.     extern    void    save_ini( FILE *fstream );
  95.     extern    void    load_ini( FILE *fstream );
  96.     /*
  97.      * S.G.B.D.
  98.      */
  99.     extern    void    clear_AllLocks(                         
  100.                             COMPACT_RECORD *pCompRec );     /* In:  Ptr sur record … initialiser */
  101.  
  102.  
  103. /*
  104.  * PUBlic INTernal prototypes:
  105.  */
  106.     static    int    save_file(                     /* Out: */
  107.                             char    *    titre,        /* In:  Tritre du s‚lecteur de fichiers */
  108.                             int         file_type,    /* In:  Type de fichier … sauver */ 
  109.                             FTA    *    fta );        /* In:  File Transfer Area: fournit ptr sur donn‚es … sauver */
  110.  
  111.     static    unsigned long    get_file_ext( const char *filename );
  112.     static    int    ctrl_extension( const char *nom, int doc_type );
  113.     static    int    directload_file2( int file_type, FTA *fta, int obligatoire );
  114.     static    int    directsave_file( int file_type, FTA *fta );
  115.  
  116.     static    char    *ffind( FILE *fstream, char *string );
  117.     static    void    load_str_tobuffer( FILE *fstream, int maxlen );
  118.  
  119.     static    int    merge_text( FILE *fstream, TEXTLINE * start_line, TEXTINFO * info_ptr );
  120.  
  121.     static    int    load_1text( FILE *fstream, DATADIR *datadir, char * filename );
  122.  
  123.     static    int    load_pi3( FILE *fstream, DATADIR *datadir, char * filename );
  124.     static    int    write_PIx(                             /* In: !=0 si erreur */
  125.                             FILE         *    fstream,         /* In: Fichier dans lequel on veut sauver */
  126.                             DEGASPIX *    pDegasPix );    /* In: Ptr sur image en m‚moire */
  127.  
  128.     static    int    DataPge_LoadStdText( 
  129.                             DATAPAGE *    curr_page,
  130.                             FILE         *    fstream ); 
  131.  
  132.     static    DATADIR *load_arbo( FILE *fstream );
  133.     static    int    load_dirmap( FILE *fstream, unsigned * *dir_map );
  134.     static    KEYWORD_LIST *    load_inlinks( 
  135.                         FILE     *    fstream,
  136.                         int        n_Version );
  137.     static    ARBO_TEXTPAR    *load_atextpar( FILE *fstream );
  138.     static    ARBO_FIELDPARS *    load_fieldpar( 
  139.             FILE             *    fstream,
  140.             SERIALIZE_TYPE    SerializeType,    /* In: Type de donn‚es … charger */
  141.             int                n_Version );    /* In: version de fichier */
  142.     static    BOOL    load_pagesarbo(                 /* Out: FALSE0 si chargement a ‚chou‚ */
  143.                     FILE         *    fstream, 
  144.                     DATADIR     *    pDataDi,        /* In: DataDir ds lequel on charge */
  145.                     int            n_Version);    /* In: Version du fichier */
  146.  
  147.     static    int    save_arbo( FILE *fstream, DATADIR *datadir );
  148.  
  149.  
  150.  
  151. /*
  152.  * PRIVate INTernal prototypes:
  153.  */
  154.  
  155.     static    int    save_datas( 
  156.                             FILE             *    fstream, 
  157.                             const char    *    cpsz_FileName,    /* IN: Nom du fichier catalogue -> dossier de sauvegarde des fichiers ind‚pendants */
  158.                             DATADIR        *    datadir );
  159.     static    int    load_datas(
  160.                             FILE            *    fstream, 
  161.                             const char    *    cpsz_FileName,    /* IN: Nom du fichier catalogue -> dossier de sauvegarde des fichiers ind‚pendants */
  162.                             DATADIR        *    datadir );
  163.     static    BOOL    save_CompRecToDXF(                    /* Out: TRUE si success */
  164.                             FILE                *    fstream,     /* In:  Fichier ds lequel on doit sauver */
  165.                             COMPACT_RECORD    *    pCompRec );    /* In:  Record … sauver */
  166.     static    int    save_DBtoDXF(                         /* Out: !=0 si erreur */
  167.                                 FILE         *    fstream, 
  168.                                 char         *    generic_name, 
  169.                                 DATAPAGE *    datapage );
  170.     static    DATA_RECORDS *    load_datafile(
  171.                                         FILE *fstream );
  172.  
  173.     static    void    save_specialpar( 
  174.                             FILE         *    fstream, 
  175.                             PAGEARBO    *    pArboPg );
  176.     static    ARBO_SPECIALPAR load_specialpar(        /* Out: Params charg‚, NULL si pas de params */
  177.                         FILE *    fstream,        /* In:  Fichier depuis lequel on charge */
  178.                         int        n_fnct );    /* In:  Fonction de la page */
  179.  
  180.     static    void    save_atextpar( FILE *fstream, ARBO_TEXTPAR *atextpar );
  181.     static    void    save_fields( 
  182.             FILE                 *    fstream, 
  183.             ARBO_FIELDPARS *    field_params, 
  184.             SERIALIZE_TYPE        SerializeType );    /* In: Type de donn‚es … charger */
  185.  
  186.  
  187.     static    int    load_PagesEcran(                 /* Out: YES1 ou NO0 */
  188.                             FILE         *    fstream,        /* In: Fichier depuis lequel on charge */
  189.                             DATADIR    *    pDataDir );    /* In: Dossier dans lequel on doit charger */
  190.     static    int    load_pages( FILE *fstream, DATADIR *datadir );
  191.     static    int    load_1page( FILE *fstream, DATADIR *datadir, char* filename );
  192.     static    int    save_PagesEcran(                 /* Out: YES1 si sauvegarde OK */
  193.                             FILE         *    fstream,     /* In:  Fichier ds lequel on doit sauver */
  194.                             DATADIR    *    pDataDir );    /* In:  Dossier de pages ‚cran … sauver */
  195.  
  196.     static    int    load_textes( 
  197.                             FILE *fstream,         /* In: Fichier depuis lequel on charge */
  198.                             const char    *    cpsz_FileName,    /* IN: Nom du fichier catalogue -> dossier de sauvegarde des fichiers ind‚pendants */
  199.                             DATADIR *datadir );    /* In: dossier dans lequel on charge */
  200.     static    int    save_textes(
  201.                             FILE *fstream, 
  202.                             const char    *    cpsz_FileName,    /* IN: Nom du fichier catalogue -> dossier de sauvegarde des fichiers ind‚pendants */
  203.                             DATADIR *datadir );
  204.     static    void    save_text( 
  205.                             FILE         *    fstream,     /* In: Fichier ds lequel on veut sauver */
  206.                             TEXTINFO *    info_ptr );    /* In: Ptr sur le texte … sauver */
  207.  
  208.     static    DATABLOCK *    load_DataBlock(             /* Out: Infos sur texte charg‚ */
  209.                                     FILE    *    fstream,        /* In:  Fichier duquel on charge */
  210.                                     FEMODE    FEMode);        /* In:  Mode d'enregistrement ds fichier */
  211.     static    int    save_DataBlock( 
  212.                             FILE            *    fstream,         /* In: Fichier ds lequel on veut sauver */
  213.                             DATABLOCK    *    pDataBlock,        /* In: Ptr sur le texte … sauver */
  214.                             FEMODE            FEMode);            /* In:  Mode d'enregistrement ds fichier */
  215.  
  216.  
  217.  
  218.  
  219. /*
  220.  * ------------------------ VARIABLES -------------------------
  221.  */
  222.     
  223. /*
  224.  * External variables: 
  225.  */
  226.     extern    char    *    G_crlf;                        /* Retour … la ligne */
  227.     extern    char    *    G_tmp_buffer;                /* Peut contenir un texte long de 255 signes + '\0' */
  228.     extern    char    *    G_2nd_buffer;                /* DeuxiŠme buffer */
  229.     /* 
  230.      * Vdi: 
  231.      */
  232.     extern    int        G_def_text_width;            /* Largeur d'un texte par d‚faut */
  233.  
  234. /*
  235.  * Public variables: 
  236.  */
  237.     char    G_stutpath[ MAXPATH ];    /* Path dans lequel se trouve Stut One */
  238.     char    G_filename[ 13 ];            /* Nom du fichier … charger ex:TEST.TXT */
  239.     char    G_filepath[ MAXPATH + 13 ];    /* Chemin du fichier … charger ex:D\EXEMPLE */
  240.  
  241.     
  242. /*
  243.  * Private variables: 
  244.  */
  245.     /* 
  246.      * Chemin s‚lect courant ex:D:\EXEMPLE\*.* 
  247.      */
  248.     static    char    M_fs_iinsel[ 13 ];
  249.     /* 
  250.      * Fichier s‚lectionn‚ ex:TEST.TXT 
  251.      */
  252.     static    char    M_fs_iinpath[ MAXPATH + 13 ];    /*  +13 pour \12345678.ABC  */
  253.     static    char    *M_path_end_adr;    /* Pointe sur le dernier Backslash du PATH dans G_filepath */
  254.     /* 
  255.      * Header d'un fichier (partie commune … tous les fichiers: 
  256.      */
  257.     static     char    *M_header = "Applicat: Stut One\r\nCompatib: 0.00\r\nData... :\r\n";
  258.      
  259.  
  260. /*
  261.  * ------------------------ FUNCTIONS -------------------------
  262.  */
  263.  
  264. /*
  265.  * init_fsel(-)
  266.  *
  267.  * Purpose:
  268.  * --------
  269.  * Init variables pour sélecteur de fichier
  270.  *
  271.  * History:
  272.  * --------
  273.  * 1993: fplanque: Created
  274.  */
  275. void    init_fsel( void )
  276. {
  277.     TRACE0( "Initializing " THIS_FILE );
  278.  
  279.     /*
  280.      * Sauvegarde du chemin d'accŠs au d‚marrage: 
  281.      */
  282.     getcwd( G_stutpath, MAXPATH );
  283.  
  284.     /*
  285.      * Init du chemin d'accŠs courant: 
  286.      */
  287.     getcwd( M_fs_iinpath, MAXPATH );        /* Path courant */
  288.     path_add_backslash( M_fs_iinpath );    /* Rajoute backslash si n‚cessaire */
  289.     strcat ( M_fs_iinpath, "*.*");        /* Rajoute "*.*" */
  290.  
  291.     /*
  292.      * Init du fichier courament s‚lectionn‚: 
  293.      */
  294.     M_fs_iinsel[0]='\0';                    /* Aucun fichier s‚lectionn‚ */
  295.  
  296. }
  297.  
  298.  
  299. /*
  300.  * get_fs_iinsel(-)
  301.  */
  302. char * get_fs_iinsel( void )
  303. {
  304.     return M_fs_iinsel;    
  305. }
  306.  
  307. /*
  308.  * get_fs_iinpath(-)
  309.  */
  310. char * get_fs_iinpath( void )
  311. {
  312.     return M_fs_iinpath;    
  313. }
  314.  
  315.  
  316. /*
  317.  * erase_extension(-)
  318.  *
  319.  * Purpose:
  320.  * --------
  321.  * Efface l'extension d'un nom de fichier (ou path complet)
  322.  *
  323.  * History:
  324.  * --------
  325.  * 15.12.94: fplanque: Created
  326.  */
  327. void    erase_extension(
  328.             char    *    psz_Filename )        /* In: Nom de fichier dont on veut effacer l'extension */
  329. {
  330.     char            *    piBsz_dot;
  331.  
  332.     piBsz_dot = strBchr( psz_Filename, '.' );
  333.     if( piBsz_dot != NULL )
  334.     {
  335.         piBsz_dot[0] = '\0';
  336.     }
  337. }
  338.  
  339. /*
  340.  * replace_extensionInBuf(-)
  341.  *
  342.  * Purpose:
  343.  * --------
  344.  * Remplace l'extension d'un nom de fichier (ou path complet)
  345.  *
  346.  * Note:
  347.  * -----
  348.  * Il doit y avoir suffisament de place ds le buffer pour contenir la nouvelle extension
  349.  *
  350.  * History:
  351.  * --------
  352.  * 17.12.94: fplanque: Created
  353.  */
  354. void    replace_extensionInBuf(
  355.             char            *    pBsz_Filename,        /* In: Nom de fichier dont on veut changer l'extension */
  356.             const char    *    cpsz_extension )    /* In: Extension a utiliser */
  357. {
  358.     char            *    piBsz_dot;
  359.  
  360.     piBsz_dot = strBchr( pBsz_Filename, '.' );
  361.     if( piBsz_dot != NULL )
  362.     {
  363.         strcpy( piBsz_dot, cpsz_extension );    
  364.     }
  365.     else
  366.     {
  367.         strcat( pBsz_Filename, cpsz_extension );    
  368.     }
  369. }
  370.  
  371.  
  372.  
  373.  
  374.  
  375. /*
  376.  * path_add_backslash(-)
  377.  *
  378.  * Purpose:
  379.  * --------
  380.  * Ajoute backslash final au path si n‚cessaire
  381.  *
  382.  * Algorythm:
  383.  * ----------  
  384.  * Si le nom ne se fini pas par un \ on le rajoute
  385.  *
  386.  * History:
  387.  * --------
  388.  * 1993: fplanque: Created
  389.  * 28.03.95: optimized
  390.  */
  391. void    path_add_backslash( char *path )
  392. {
  393.     size_t len = strlen( path );
  394.  
  395.     if( path[ len -1 ] != '\\' )
  396.     {    /*
  397.          * Si on est dans un dossier: 
  398.          */
  399.         path[ len ] = '\\';
  400.         path[ len+1 ] = '\0';
  401.     }
  402.  
  403. }
  404.  
  405.             
  406.             
  407.  
  408. /*
  409.  * directload_file2(-)
  410.  *
  411.  * Purpose:
  412.  * --------
  413.  * Charge un fichier dont on connait d‚j… le chemin d'accŠs
  414.  *
  415.  * History:
  416.  * --------
  417.  * 1993: fplanque: Created
  418.  * 19.06.94: charge groupes de textes
  419.  * 19.06.94: expansion des groupes g‚n‚riques
  420.  */
  421. int    directload_file2( 
  422.             int    file_type,         /* In: type de fichier */
  423.             FTA *    fta,                 /* In: */
  424.             int     obligatoire )    /* In: */
  425. {
  426.     /*
  427.      * Variables: 
  428.      */
  429.     int        ouverture_ok = NO0;    /* =YES si on a pu ouvrir le contenu */
  430.     int        new_defname     = NO0;    /* =YES si le nom fichier actuel doit ˆtre utilis‚ pour sauvegarde & *.INF */
  431.     unsigned long    ftype;            /* Extension du fichier choisi convertie en long */
  432.     FILE        *fstream;
  433.  
  434.     /*
  435.      * Fixe le chemin courant: 
  436.      */
  437.     Dsetdrv ( G_filepath[0] - 'A' );    /* Ch drive */
  438.     chdir( G_filepath );                    /* Ch dir */
  439.  
  440.     /*
  441.      * Ouvre fichier: 
  442.      */
  443.     fstream = fopen( G_filename, "rb" );
  444.     if ( fstream == NULL )   
  445.     {    /*
  446.          * Si on a pas pu ouvrir 
  447.          */
  448.         if ( errno != 2  ||  obligatoire == YES1 )
  449.         {    /*
  450.              * Slt si ce n'est PAS un fichier non obligatoire
  451.              * qui n'a pas ‚t‚ trouv‚ 
  452.              */
  453.             alert( errno );
  454.         }
  455.     }
  456.     else                            
  457.     {
  458.         ftype = get_file_ext( G_filename );        /* Extension */
  459.  
  460.         /*
  461.          * Expansion des types de fichiers g‚n‚riques:
  462.          */
  463.         switch( file_type )
  464.         {
  465.             case    GF_PAGES_ECRAN:
  466.                 if( ftype == '.STU' )
  467.                     file_type = FS_PAGES_ECRAN;
  468.                 else
  469.                     file_type = F_VDT;
  470.                 break;                            
  471.  
  472.             case    GF_TEXTES:
  473.                 if( ftype == '.STU' )
  474.                     file_type = FS_TEXTES;
  475.                 else
  476.                     file_type = F_TEXTE;
  477.                 break;                            
  478.         }
  479.  
  480.         /*
  481.          * Charge en fonction du type de fichier:
  482.          */
  483.         switch( file_type )
  484.         {
  485.             case    FS_ARBO:
  486.                 /*
  487.                  * Chargement d'un dossier arborescence: 
  488.                  */
  489.                 *(fta -> datadir_ptr) = load_arbo( fstream );
  490.  
  491.                 if ( *(fta -> datadir_ptr) != NULL )
  492.                 {    /* 
  493.                       * Si on a charg‚ un DATADIR: 
  494.                       */
  495.                     ouverture_ok     = YES1;    /* Chargement OK */
  496.                     new_defname        = YES1;    /* Nouveau nom par d‚faut */
  497.                 }
  498.                 break;
  499.  
  500.             case    FS_PAGES_ECRAN:
  501.                 /*
  502.                  * Chargement d'une s‚rie de pages: 
  503.                  */
  504.                 ouverture_ok = load_PagesEcran( fstream, *(fta -> datadir_ptr) );
  505.                 new_defname  = YES1;        /* Nouveau nom par d‚faut */
  506.                 break;
  507.  
  508.             case    F_VDT:
  509.                 /*
  510.                  * Ajout d'un fichier isol‚: 
  511.                  */
  512.                 ouverture_ok = load_1page( fstream, *(fta -> datadir_ptr), M_fs_iinsel );
  513.                 break;
  514.  
  515.             case    FS_DATAS:
  516.                 ouverture_ok = load_datas( fstream, G_filename, *(fta -> datadir_ptr) );
  517.                 new_defname  = YES1;            /* Nouveau nom par d‚faut */
  518.                 break;
  519.  
  520.             case    FS_TEXTES:
  521.                 ouverture_ok = load_textes( fstream, G_filename, *(fta -> datadir_ptr) );
  522.                 new_defname  = YES1;            /* Nouveau nom par d‚faut */
  523.                 break;
  524.  
  525.             case    F_TEXTE:
  526.                 ouverture_ok = load_1text( fstream, *(fta -> datadir_ptr), M_fs_iinsel );
  527.                 break;
  528.                 
  529.             case    F_TEXTE_ASCII:
  530.                 ouverture_ok = merge_text( fstream, (fta -> textinfo) -> lastline, fta -> textinfo );
  531.                 break;                            
  532.         
  533.             case    F_IMAGE:
  534.                 ouverture_ok = load_pi3( fstream, *(fta -> datadir_ptr), M_fs_iinsel );
  535.                 break;
  536.                 
  537.             case    FS_INF:
  538.                 if ( fta -> param == 1 )
  539.                 {    /*
  540.                      * S'il faut initialiser avant de charger: 
  541.                      */
  542.                     init_serv();
  543.                 }
  544.                 load_inf( fstream );        /* Charge params-serveur + serveur */
  545.                 break;
  546.  
  547.             case    FS_INI:
  548.                 load_ini( fstream );        /* Charge configuration */
  549.                 break;
  550.  
  551.             default:
  552.                 signale("Type de fichier inconnu");
  553.         }
  554.         /*
  555.          * Ferme le fichier: 
  556.          */
  557.         fclose( fstream );
  558.     }
  559.  
  560.     /*
  561.      * Teste s'il faut sauver le nom du fichier 
  562.      */
  563.     if ( ouverture_ok )
  564.     {
  565.         if ( new_defname )
  566.         {    /* S'il faut m‚moriser le nom & le chemin du fichier charg‚: */
  567.             return    2;        /* Nom et Path … m‚moriser dispo ds G_filename et G_filepath */
  568.         }
  569.         
  570.         return    1;
  571.     }
  572.  
  573.     /*
  574.      * Si le chargement ne s'est pas effectu‚: 
  575.      */    
  576.     return    FALSE0;
  577. }
  578.  
  579.  
  580.  
  581. /*
  582.  * get_file_ext(-)
  583.  *
  584.  * Purpose:
  585.  * --------
  586.  * Fournit l'extension du nom de fichier
  587.  *
  588.  * History:
  589.  * --------
  590.  * 1993: fplanque: Created
  591.  */
  592. unsigned long    get_file_ext( const char *filename )
  593. {
  594.     /* 
  595.      * Variables: 
  596.      */
  597.     unsigned long    f_ext;        /* Extension du fichier choisi convertie en long */
  598.     char                *extension;
  599.  
  600.     /*
  601.      * Recherche le point avant l'extension = d‚but de l'extension 
  602.      */
  603.     extension = strchr( filename, '.' );    /* Pointeur sur le texte d'extension */
  604.  
  605.     /*
  606.      * Cr‚e un long int contenant l'extension (Top-moumoute!): 
  607.      */
  608.     if ( extension != NULL )
  609.     {
  610.         f_ext =     /* Extension ds un mot long */
  611.               ( ((unsigned long)extension[0]) <<24) 
  612.             | ( ((unsigned long)extension[1]) <<16)
  613.             | ( ((unsigned long)extension[2]) <<8)
  614.             | ( (unsigned long)extension[3]);
  615.     }
  616.     else
  617.     {
  618.         f_ext = 0UL;        /* Pas d'extension */
  619.     }
  620.  
  621.     return    f_ext;
  622. }
  623.  
  624.  
  625.  
  626. /*
  627.  * ctrl_extension(-)
  628.  *
  629.  * Purpose:
  630.  * --------
  631.  * Contr“le l'extension
  632.  *
  633.  * History:
  634.  * --------
  635.  * 1993: fplanque: Created
  636.  */
  637. int    ctrl_extension( const char *nom, int doc_type )
  638. {
  639.     static char        *err_text="[3][|  Vous devez choisir|  un fichier portant|  l'extension .ABC ! ][R‚essayer|Abandonner]";
  640.     char                *extension;
  641.     char                *valid;
  642.     int                resultat=0;
  643.  
  644.     /*
  645.      * Recherche le point avant l'extension = d‚but de l'extension 
  646.      */
  647.     extension = strchr( nom, '.' );    /* Pointeur sur le texte d'extension */
  648.  
  649.     switch( doc_type )
  650.     {
  651.         case F_IMAGE:
  652.         {
  653.             valid = ".PI3";        /* Extension demand‚e */
  654.             
  655.             if    ( extension == NULL || strcmp( extension, valid ) != 0 )
  656.             {    /*
  657.                  * Si le nom ne comporte pas la bonne extension: 
  658.                  */
  659.                 memcpy( err_text+61, valid, 4);
  660.                 resultat = form_alert( 1, err_text );
  661.             }
  662.             
  663.             break;
  664.         }
  665.  
  666.         case FS_ARBO:
  667.         {
  668.             valid = ".STU";        /* Extension demand‚e */
  669.             
  670.             if    ( extension == NULL || strcmp( extension, valid) != 0 )
  671.             {    /*
  672.                  * Si le nom ne comporte pas la bonne extension: 
  673.                  */
  674.                 memcpy( err_text+61, valid, 4);
  675.                 resultat = form_alert( 1, err_text );
  676.             }
  677.             
  678.             break;
  679.         }
  680.  
  681.     }
  682.  
  683.     return resultat;        /* 0 si ext correspond */
  684.  
  685. }
  686.  
  687.  
  688.  
  689. /*
  690.  * recall_filepath(-)
  691.  *
  692.  * Purpose:
  693.  * --------
  694.  * Retourne dans le dernier chemin d'accŠs associ‚ au DATAGROUP
  695.  * en vue de la prochaine sauvegarde
  696.  *
  697.  * History:
  698.  * --------
  699.  * 1993: fplanque: Created
  700.  * 15.12.94: le NOM est TOUJOURS fix‚
  701.  * 13.02.95: renvoie valeur de retour
  702.  */
  703. BOOL    recall_filepath(                     /* Out: TRUE if success */
  704.             DATAGROUP *    datagroup )
  705. {
  706.     /*
  707.      *    Nom du fichier: 
  708.      */
  709.     strcpy( M_fs_iinsel, datagroup -> filename );
  710.  
  711.     if( datagroup -> filepath != NULL )
  712.     {    /*
  713.          * Si un chemin a ‚t‚ m‚moris‚: 
  714.          * Nouveau chemin d'accŠs courant: 
  715.          */
  716.         strcpy( M_fs_iinpath, datagroup -> filepath );
  717.         path_add_backslash( M_fs_iinpath );    /* Rajoute backslash si n‚cessaire */
  718.         strcat ( M_fs_iinpath, "*.*");        /* Rajoute "*.*" */
  719.     
  720.         return    TRUE_1;
  721.     }
  722.  
  723.     return FALSE0;
  724. }
  725.  
  726.  
  727.  
  728. /*
  729.  * set_DtPgFilePathToFS(-)
  730.  *
  731.  * Purpose:
  732.  * --------
  733.  * Retourne dans le chemin d'accŠs par d‚faut associ‚ … la DTAPAGE
  734.  * en fonction de son emplacement ds dtagaroup et de l'emplacement
  735.  * sur le disque de ce datagroup:
  736.  * en vue de la prochaine sauvegarde
  737.  *
  738.  * Notes:
  739.  * ------
  740.  * Similaire … set_DtPgFilePath()
  741.  *
  742.  * History:
  743.  * --------
  744.  * 15.12.94: fplanque: Created based on recall_filepath()
  745.  */
  746. BOOL    set_DtPgFilePathToFS(            /* Out: TRUE si success */
  747.             DATAPAGE    *    pDataPage )        /* In: Page … sauver */ 
  748. {
  749.     DATADIR        *    pDataDir      = pDataPage -> pDataDir;        /* Directory dans lequel se trouve la page */
  750.     DATAGROUP    *    pDataGroup = pDataDir -> pDataGroup;
  751.  
  752.     /*
  753.      *    Nom du fichier: 
  754.      */
  755.     strcpy( M_fs_iinsel, pDataPage -> nom );
  756.  
  757.     if( pDataGroup -> filepath != NULL )
  758.     {    /*
  759.          * Si un chemin a ‚t‚ m‚moris‚: 
  760.          * Chemin d'acces au group.STU:
  761.          */
  762.         strcpy( M_fs_iinpath, pDataGroup -> filepath );
  763.         path_add_backslash( M_fs_iinpath );    /* Rajoute backslash si n‚cessaire */
  764.  
  765.         /*
  766.          * On va se placer dans un sous dossier de nom du group:
  767.          */
  768.         strcat( M_fs_iinpath, pDataGroup -> filename );
  769.         erase_extension( M_fs_iinpath );
  770.  
  771.         strcat( M_fs_iinpath, "\\*.*");        /* Rajoute "*.*" */
  772.  
  773.         return    TRUE_1;
  774.     }
  775.  
  776.     return    FALSE0;
  777. }
  778.             
  779.  
  780.  
  781.  
  782. /*
  783.  * set_DtPgFilePath(-)
  784.  *
  785.  * Purpose:
  786.  * --------
  787.  * Retourne dans le chemin d'accŠs par d‚faut associ‚ … la DTAPAGE
  788.  * en fonction de son emplacement ds dtagaroup et de l'emplacement
  789.  * sur le disque de ce datagroup:
  790.  * en vue de la prochaine sauvegarde
  791.  *
  792.  * Notes:
  793.  * ------
  794.  * Similaire … set_DtPgFilePathToFS()
  795.  * 
  796.  * History:
  797.  * --------
  798.  * 13.02.95: fplanque: Created based on set_DtPgFilePathToFS()
  799.  */
  800. BOOL    set_DtPgFilePath(            /* Out: TRUE si success */
  801.             DATAPAGE    *    pDataPage )        /* In: Page … sauver */ 
  802. {
  803.     DATADIR        *    pDataDir      = pDataPage -> pDataDir;        /* Directory dans lequel se trouve la page */
  804.     DATAGROUP    *    pDataGroup = pDataDir -> pDataGroup;
  805.  
  806.     /*
  807.      *    Nom du fichier: 
  808.      */
  809.     strcpy( G_filename, pDataPage -> nom );
  810.  
  811.     if( pDataGroup -> filepath != NULL )
  812.     {    /*
  813.          * Si un chemin a ‚t‚ m‚moris‚: 
  814.          * Chemin d'acces au group.STU:
  815.          */
  816.         strcpy( G_filepath, pDataGroup -> filepath );
  817.         path_add_backslash( G_filepath );    /* Rajoute backslash si n‚cessaire */
  818.  
  819.         /*
  820.          * On va se placer dans un sous dossier de nom du group:
  821.          */
  822.         strcat( G_filepath, pDataGroup -> filename );
  823.         erase_extension( G_filepath );
  824.  
  825.         return    TRUE_1;
  826.     }
  827.  
  828.     return    FALSE0;
  829. }
  830.  
  831.             
  832. /*
  833.  * directsave_file(-)
  834.  *
  835.  * Purpose:
  836.  * --------
  837.  * Sauve un fichier dont on connait d‚j… le chemin d'accŠs
  838.  *
  839.  * Suggest:
  840.  * --------
  841.  * v‚rifier que certains fichiers ont bien une extension
  842.  * ex DATAS.STU paske DATAS tout court, c le nom du dossier associ‚!
  843.  *
  844.  * History:
  845.  * --------
  846.  * 1993: fplanque: Created
  847.  * 19.06.94: support des textes serveur
  848.  * 29.06.94: support textes compact‚s, pages vdt, degas
  849.  * 02.09.94: support des fichiers de pages vid‚otex
  850.  */
  851. int    directsave_file(
  852.             int    file_type,         /* In: Type de fichier … sauver */
  853.             FTA *    fta )
  854. {
  855.     int        sauve_ok         = NO0;    /* =YES si on a pu sauver le contenu */
  856.     int        new_defname     = NO0;    /* =YES si le nom fichier actuel doit ˆtre utilis‚ pour sauvegarde suivante & *.INF */
  857.     FILE    *    fstream;
  858.  
  859.     /*
  860.      * On se place dans le dossier concern‚: 
  861.      */
  862.     Dsetdrv ( G_filepath[0] - 'A' );    /* Ch drive */
  863.     chdir( G_filepath );                    /* Ch dir */
  864.     
  865.     /*
  866.      * Ouvre fichier 
  867.      */
  868.     fstream = fopen( G_filename, "wb" );
  869.     if ( fstream == NULL )   /* Si on a pas pu ouvrir */
  870.     {
  871.         if ( errno != 5 )
  872.         {    /* 
  873.              * Si ce n'est pas une erreur de protection
  874.              * (qui b‚n‚ficie d'une alerte TOS automatique ) 
  875.              */
  876.             alert( errno );
  877.         }
  878.     }
  879.     else                            
  880.     {
  881.         switch( file_type )
  882.         {
  883.             case    FS_ARBO:
  884.                 /*
  885.                  * Dossier arbo:
  886.                  */
  887.                 sauve_ok = save_arbo( fstream, fta -> datadir );
  888.                 new_defname = YES1;        /* Il faut m‚moriser le nom du fichier */
  889.                 break;
  890.  
  891.             case    FS_PAGES_ECRAN:
  892.                 /*
  893.                  * Dossier de pages ‚cran:
  894.                  */
  895.                 sauve_ok = save_PagesEcran( fstream, fta -> datadir );
  896.                 new_defname = YES1;        /* Il faut m‚moriser le nom du fichier */
  897.                 break;
  898.  
  899.             case    F_VDT:
  900.                 /*
  901.                  * Page vid‚otex:
  902.                  */
  903.                 if( save_DataBlock( fstream, fta -> pDataPage -> data.dataBlock, FEMODE_SINGLE ) == SUCCESS0 )
  904.                 {
  905.                     sauve_ok = YES1;
  906.                 }
  907.                 break;
  908.  
  909.             case    FS_DATAS:
  910.                 /*
  911.                  * Dossier de bases de donn‚es:
  912.                  */
  913.                 sauve_ok = save_datas( fstream, G_filename, fta -> datadir );
  914.                 new_defname = YES1;        /* Il faut m‚moriser le nom du fichier */
  915.                 break;
  916.  
  917.             case    FS_DXF:
  918.                 /*
  919.                  * Base de donn‚es:
  920.                  */
  921.                 if( save_DBtoDXF( fstream, G_filename , fta -> pDataPage ) == SUCCESS0 )
  922.                 {
  923.                     sauve_ok = YES1;
  924.                 }
  925.                 break;
  926.  
  927.             case    FS_TEXTES:
  928.                  /*
  929.                   * Dossier de textes:
  930.                   */
  931.                 sauve_ok = save_textes( fstream, G_filename, fta -> datadir );
  932.                 new_defname = YES1;        /* Il faut m‚moriser le nom du fichier */
  933.                 break;
  934.  
  935.             case    F_TEXTE_ASCII:
  936.                 /*
  937.                  * texte sous forme formatt‚e en m‚moire:
  938.                  */
  939.                 save_text( fstream, fta -> textinfo );
  940.                 break;
  941.  
  942.             case    F_TEXTE:
  943.                 /*
  944.                  * texte sous forme compact‚e en m‚moire:
  945.                  */
  946.                 if( save_DataBlock( fstream, fta -> pDataPage -> data.dataBlock, FEMODE_SINGLE ) == SUCCESS0 );
  947.                 {
  948.                     sauve_ok = YES1;
  949.                 }
  950.                 break;
  951.  
  952.             case    FS_IMAGES:
  953.                 /* sauve_ok = save_images( fstream, fta -> datadir ); */
  954.                 new_defname = YES1;        /* Il faut m‚moriser le nom du fichier */
  955.                 break;
  956.  
  957.             case    F_IMAGE:
  958.                 /*
  959.                  * Sauve une image seule:
  960.                  */
  961.                 if( write_PIx( fstream, fta -> pDataPage -> data.degaspix ) == SUCCESS0 );
  962.                 {
  963.                     sauve_ok = YES1;
  964.                 }
  965.                 break;
  966.                                             
  967.             case    FS_INF:
  968.                 save_inf( fstream );
  969.                 break;
  970.                                             
  971.             case    FS_INI:
  972.                 save_ini( fstream );
  973.                 break;
  974.  
  975.             default:
  976.                 signale( "Format de fichier inconnu" );
  977.         }
  978.         if( fclose( fstream ) != 0 )
  979.             alert( errno );
  980.     }
  981.  
  982.     /*
  983.      * Teste s'il faut sauver le nom du fichier 
  984.      */
  985.     if ( sauve_ok )
  986.     {
  987.         if ( new_defname )
  988.         {    /*
  989.              * S'il faut m‚moriser le nom & le chemin du fichier sauv‚: 
  990.              */
  991.             return    2;        /* Nom et Path … m‚moriser dispo ds G_filename et G_filepath */
  992.         }
  993.         
  994.         return    1;
  995.     }
  996.  
  997.     /*
  998.      * Si la sauvegarde ne s'est pas effectu‚: 
  999.      */    
  1000.     return    0;
  1001. }
  1002.  
  1003.  
  1004.  
  1005. /*
  1006.  * file_access_extract(-)
  1007.  *
  1008.  * Purpose:
  1009.  * --------
  1010.  * Fixe le chemin d'accŠs … un fichier dont on connait le path complet
  1011.  *
  1012.  * Suggest:
  1013.  * --------
  1014.  * PROVISOIRE: d‚tection d'erreurs … rajouter
  1015.  *
  1016.  * History:
  1017.  * --------
  1018.  * 1993: fplanque: Created
  1019.  */
  1020. int    file_access_extract( 
  1021.             char *file_access )
  1022. {
  1023.     /*    printf("File acces: %s\n",file_access); */
  1024.  
  1025.     M_path_end_adr=(char *)strrchr( file_access, '\\');
  1026.  
  1027.     if ( M_path_end_adr != NULL )
  1028.     {    /* Si on a trouv‚ le \ en question: */
  1029.         /* S‚pare le path du nom: */
  1030.         *M_path_end_adr = '\0';
  1031.         /* Recopie path: */
  1032.         strcpy( G_filepath, file_access );
  1033.         /* Recopie nom de fichier: */
  1034.         strcpy( G_filename, &M_path_end_adr[1] );
  1035.  
  1036.         /*    printf("Path=%s File=%s\n",G_filepath, G_filename ); */
  1037.  
  1038.         return    OK1;
  1039.     }
  1040.  
  1041.     return WRONG0;
  1042.  
  1043. }
  1044.  
  1045.  
  1046.  
  1047.  
  1048. /*
  1049.  * head_control(-)
  1050.  *
  1051.  * Purpose:
  1052.  * --------
  1053.  * Contr“le du header d'un fichier
  1054.  *
  1055.  * History:
  1056.  * --------
  1057.  * 1993: fplanque: Created
  1058.  * 15.09.94: Propose des alternatives si fmt fichier vid‚otex .STU non reconnu
  1059.  * 23.11.94: controle no de version
  1060.  * 21.01.95: renvoie no de version du fichier
  1061.  */
  1062. int    head_control(                     /* Out: no de version, ou ERROR_1 si pb ou CHANGE_2 */
  1063.             FILE *            fstream, 
  1064.             int                 ftype, 
  1065.             char *            content )
  1066. {
  1067.     /*
  1068.      * Variables: 
  1069.      */
  1070.     char    *    line_end;
  1071.     int        n_Version = ERROR_1;
  1072.     size_t    size_LineEnd;
  1073.  
  1074.     /************************/
  1075.     /* Contr“le du contenu: */
  1076.     /************************/
  1077.     line_end = ffind( fstream, "Content : " );
  1078.     if ( line_end == NULL )
  1079.     {    
  1080.         if( ftype == FS_PAGES_ECRAN )
  1081.         {    /*
  1082.               * Fichier de pages ‚cran n'‚tant pas en Smart Format
  1083.               * On demande si on veut tenter autre chose...
  1084.               */
  1085.             if( alert( QUERY_FILEFORMAT ) == 1 )
  1086.             {    /*
  1087.                  * On veut tenter autre chose:
  1088.                  */
  1089.                 return    CHANGE_2;
  1090.             }
  1091.         }
  1092.  
  1093.         alert( BAD_FILEFMT );    /* Format de fichier non reconnu! */
  1094.         return    ERROR_1;    
  1095.     }
  1096.  
  1097.     /*
  1098.      * Si on trouve le champ content dans le header: 
  1099.      */
  1100.     if ( stricmp( content, line_end ) != 0 )
  1101.     {    /*
  1102.          * Fichier ne contient pas ce qu"on cherche: 
  1103.          */
  1104.         alert( BAD_CONTENT, ftype );
  1105.         return    ERROR_1;    
  1106.     }
  1107.     
  1108.     
  1109.     /*
  1110.      * Si le contenu est correct: 
  1111.      */
  1112.  
  1113.     /**********************************/
  1114.     /* Contr“le de l'appli cr‚atrice: */
  1115.     /**********************************/
  1116.     line_end = ffind( fstream, "Applicat: " );
  1117.     if ( line_end == NULL )
  1118.     {    /* Format de header inconnu: */
  1119.         alert( BAD_FILEFMT );    /* Format de fichier non reconnu! */
  1120.         return    ERROR_1;    
  1121.     }
  1122.  
  1123.     /*
  1124.      * Si on trouve le champ Application dans le header: 
  1125.      */
  1126.     if ( ftype != FS_DXF && stricmp( "Stut One", line_end ) != 0 )
  1127.     {    /* Fichier n'est pas au format STUT ONE: */
  1128.         alert( BAD_FILEOWN );
  1129.         return    ERROR_1;    
  1130.     }
  1131.     
  1132.     /*
  1133.      * Si l'application cr‚atrice est correcte: 
  1134.      */
  1135.     
  1136.     /**************************/
  1137.     /* Cherche No de version: */
  1138.     /**************************/
  1139.     if( ffind( fstream, "Compatib:" ) == NULL )
  1140.     {    /*
  1141.           * Format de header inconnu: 
  1142.           */
  1143.         alert( BAD_HEADFMT );    /* Format de header non reconnu! */
  1144.         return    ERROR_1;    
  1145.     }
  1146.  
  1147.     /*
  1148.      * G‚nŠre no de version en BCD:
  1149.      */
  1150.     size_LineEnd = strlen( line_end );
  1151.     if( size_LineEnd >=4 )
  1152.     {
  1153.         n_Version =    (line_end[ size_LineEnd-1 ]  & 0xCF)
  1154.                         |     ((line_end[ size_LineEnd-2 ]  & 0xCF) << 8)
  1155.                         |     ((line_end[ size_LineEnd-4 ]  & 0xCF) << 16);
  1156.     }
  1157.  
  1158.  
  1159.     /************************************/
  1160.     /* On se positionne sur le Donn‚es: */
  1161.     /************************************/
  1162.     if( ffind( fstream, "Data... :" ) == NULL )
  1163.     {    /* Format de header inconnu: */
  1164.         alert( BAD_HEADFMT );    /* Format de header non reconnu! */
  1165.         return    ERROR_1;    
  1166.     }
  1167.  
  1168.     /* Si on trouve le champ Data dans le header: */
  1169.  
  1170.     /* HEADER OK: */
  1171.     return    n_Version;
  1172.     
  1173. }
  1174.  
  1175.  
  1176. /*
  1177.  * ffind(-)
  1178.  *
  1179.  * Purpose:
  1180.  * --------
  1181.  * description
  1182.  *
  1183.  * Algorythm:
  1184.  * ----------  
  1185.  * Trouve une ligne de caractŠres dans un fichier texte
  1186.  *
  1187.  * History:
  1188.  * --------
  1189.  * 1993: fplanque: Created
  1190.  */
  1191. char    *ffind( FILE *fstream, char *string )
  1192. {
  1193.     size_t    maxlen = strlen( string );
  1194.  
  1195.     while( fscanf( fstream, "%256[^\r]\r\n", G_tmp_buffer ) == 1 )
  1196.     {    /* Tant qu'on a pu lire une chaine: */
  1197.  
  1198.         if( strnicmp( string, G_tmp_buffer, maxlen ) == 0 )
  1199.         {    /* Si le d‚but de ligne correspond: */
  1200.             /* Retoune la suite: */
  1201.             return    &G_tmp_buffer[ maxlen ];
  1202.         }
  1203.         
  1204.     }
  1205.  
  1206.     return    NULL;
  1207. }
  1208.  
  1209.  
  1210.  
  1211.  
  1212.  
  1213. /*
  1214.  * get_config_line(-)
  1215.  *
  1216.  * Purpose:
  1217.  * --------
  1218.  * Charge une ligne dans un fichier de config du type OBJECT=DATA
  1219.  *
  1220.  * History:
  1221.  * --------
  1222.  * fplanque: Created
  1223.  */
  1224. char    *get_config_line( 
  1225.             FILE *fstream, 
  1226.             int separat, 
  1227.             char * *object, 
  1228.             char * *data )
  1229. {
  1230.     char    *egal;        /* Pointeur sur signe = */
  1231.     char    car;
  1232.  
  1233.     /* Charge une ligne: */
  1234.         fscanf( fstream, "%32s %256[^\r]\r\n", G_2nd_buffer, G_tmp_buffer );
  1235.         /* printf("Ligne: >%s< >%s<\n", G_2nd_buffer, G_tmp_buffer); */
  1236.  
  1237.     /* Contr“le s'il s'agit d'un commentaire: */
  1238.         car = *G_2nd_buffer;
  1239.         if ( car == '!' || car == '[' )
  1240.         {    /* S'il s'agit d'un commentaire: */
  1241.             /*    printf("Commentaire: >%c< >%s< >%s<\n", car, G_2nd_buffer, G_tmp_buffer); */
  1242.             
  1243.             *object = NULL;    /* Ligne non valide */
  1244.             *data      = NULL;
  1245.             return     NULL;        /* Pas d'action */        
  1246.         }
  1247.  
  1248.     /* Cherche caractŠres s‚parateur (= ou :) */
  1249.         egal = strchr( G_tmp_buffer, separat );
  1250.         if ( egal == NULL )
  1251.         {    /* Signe non trouv‚: */
  1252.  
  1253.         /* Selon le type de s‚parateur: */
  1254.             if ( separat == ' ' )
  1255.             {    /* Si on cherchait un espace: */
  1256.             /* On fait comme s'il y en avait un … la fin de la ligne: */
  1257.                 *object = G_tmp_buffer;        /* Pointeur sur l'objet */
  1258.                 *data      = NULL;                /* Pas de sp‚cifications */
  1259.             }
  1260.             else
  1261.             {
  1262.             /* printf("Error\n"); */
  1263.             signale("Ligne invalide");
  1264.             *object = NULL;    /* Ligne non valide */
  1265.             *data      = NULL;
  1266.             }
  1267.         }
  1268.         else
  1269.         {    /* On a trouv‚ le s‚parateur */
  1270.             /* printf("\n"); */
  1271.             *egal = '\0';    /* On le remplace par un octet NUL pour scinder la chaine en 2 */
  1272.             *object = G_tmp_buffer;        /* Pointeur sur l'objet */
  1273.             *data      = &egal[1];        /* Pointeur sur la chaine de donn‚es */
  1274.         }
  1275.  
  1276.     /* Retourne commande: */
  1277.         return    G_2nd_buffer;
  1278. }
  1279.  
  1280.                     
  1281.                     
  1282. /*
  1283.  * load_str_tobuffer(-)
  1284.  *
  1285.  * Purpose:
  1286.  * --------
  1287.  * Charge une chaine termin‚e par un code <32 
  1288.  * depuis un fichier vers G_tmp_buffer
  1289.  *
  1290.  * History:
  1291.  * --------
  1292.  * 1993: fplanque: Created
  1293.  * 14.02.95: verified mallocs
  1294.  */
  1295. void    load_str_tobuffer( 
  1296.             FILE *    fstream,        /* In: Fichier depuis lequel on charge */
  1297.             int         maxlen )        /* In: Nbre de cractŠres maximum, \0 non compris */
  1298. {
  1299.  
  1300.     char *    ptr = G_tmp_buffer;    /* Pointeur sur le buffer */
  1301.     int        i     = 0;                    /* Nombre d'octets lus */
  1302.     int        car;                        /* CaractŠre courant */
  1303.  
  1304.     while
  1305.     (
  1306.         car = getc( fstream ),        /* Charge un caractŠre */
  1307.         car >= ' '  &&  i < maxlen
  1308.     )
  1309.     {
  1310.         *(ptr++) = (char)car;    /* Sauve car */
  1311.         i ++;                                /* 1 car charg‚ de plus */
  1312.     }
  1313.  
  1314.     *ptr = '\0';        /* Termine buffer avec un octet nul */
  1315.  
  1316.     /* TRACE1( "Buffer=%s<>", G_tmp_buffer );  */
  1317. }
  1318.  
  1319.  
  1320. /*
  1321.  * -------------------------- FILESELECT --------------------------------
  1322.  */
  1323.  
  1324. /*
  1325.  * load_file(-)
  1326.  *
  1327.  * Purpose:
  1328.  * --------
  1329.  * Effectue la s‚lection d'un fichier et demande son chargement
  1330.  *
  1331.  * History:
  1332.  * --------
  1333.  * 1993: fplanque: Created
  1334.  * 19.06.94: centralis‚ triatement des erreurs de s‚lection
  1335.  */
  1336. int    load_file( 
  1337.             char *titre,         /* In: titre pour FILESELECT */
  1338.             int file_type,     /* In: Type de fichier … charger */
  1339.             FTA *fta )            /*  */
  1340. {
  1341.     /*
  1342.      *  Variables: 
  1343.      */
  1344.     int        fs_iexbutton;            /* Bouton de sortie */
  1345.      int        fsel_retry;                /* =YES si on veut retenter de donner un nom! */
  1346.     int        ouverture_ok = NO0;    /* =YES si on a pu ouvrir le contenu */
  1347.  
  1348.     /*
  1349.      * Boucle d'essais de s‚lection d'un fichier valide: 
  1350.      */
  1351.     do
  1352.     {
  1353.          fsel_retry=NO0;    /* on ne veut pas encore retenter de donner un nom! */
  1354.  
  1355.          if (fsel_exinput( M_fs_iinpath, M_fs_iinsel, &fs_iexbutton, titre ) != 0)
  1356.          {    /*
  1357.               * S'il n'y a pas eu d'erreur pdt la s‚lection 
  1358.               */
  1359.             graf_mouse(BUSYBEE, 0);        /* Change curseur souris */
  1360.             
  1361.             if (fs_iexbutton == 1)        /* Si on a cliqu‚ sur OK */
  1362.             {
  1363.                 if ( strlen( M_fs_iinsel ) == 0 )
  1364.                 {    /* 
  1365.                      * On a pas donn‚ de nom de fichier: 
  1366.                      */
  1367.                     fsel_retry = alert( PERR_NO_FILENAME );
  1368.                 }
  1369.                 else
  1370.                 {    /* 
  1371.                      * On a donn‚ un nom de fichier: 
  1372.                      * Contr“le l'extension: 
  1373.                      */
  1374.                     fsel_retry=ctrl_extension( M_fs_iinsel, file_type );
  1375.     
  1376.                     if ( fsel_retry == 0 )   /* si extension OK */
  1377.                     {
  1378.                         strcpy ( G_filepath, M_fs_iinpath );
  1379.     
  1380.                         /*
  1381.                          * Il faut enlever le masque de s‚lection: 
  1382.                          */
  1383.                         M_path_end_adr=(char *)strrchr( G_filepath, '\\');
  1384.                         if ( M_path_end_adr == NULL )
  1385.                         {
  1386.                             fsel_retry = alert( PERR_INCORRECT_PATH );
  1387.                         }
  1388.                         else
  1389.                         {    /*
  1390.                              * Si le path SEMBLE correct 
  1391.                              *
  1392.                              * EnlŠve extension: 
  1393.                              */
  1394.                             M_path_end_adr[0]='\0';        /* Path sans \ final */    
  1395.  
  1396.                             /*
  1397.                              * Recopie le nom du fichier ds var globale: 
  1398.                              */
  1399.                             strcpy( G_filename, M_fs_iinsel );
  1400.  
  1401.                             /* 
  1402.                              * Chargement: 
  1403.                              */
  1404.                             ouverture_ok = directload_file2( file_type, fta, YES1 );
  1405.  
  1406.                         }
  1407.                     }
  1408.                 }
  1409.             }
  1410.         }
  1411.     } while (fsel_retry == 1 );
  1412.  
  1413.     return    ouverture_ok;
  1414. }
  1415.  
  1416.  
  1417. /*
  1418.  * save_file(-)
  1419.  *
  1420.  * Purpose:
  1421.  * --------
  1422.  * Effectue s‚lection de fichier puis
  1423.  * Sauve un document/une DATAPAGE/un DATAGROUP sur disque
  1424.  *
  1425.  * Algorythm:
  1426.  * ----------  
  1427.  * appelle directsave_file
  1428.  *
  1429.  * History:
  1430.  * --------
  1431.  * 1993: fplanque: Created
  1432.  * 19.06.94: centralis‚ triatement des erreurs de s‚lection
  1433.  */
  1434. int    save_file(                     /* Out: */
  1435.             char    *    titre,        /* In:  Tritre du s‚lecteur de fichiers */
  1436.             int         file_type,    /* In:  Type de fichier … sauver */ 
  1437.             FTA    *    fta )            /* In:  File Transfer Area: fournit ptr sur donn‚es … sauver */
  1438. {
  1439.     /*
  1440.      * Variables: 
  1441.      */
  1442.     int        fs_iexbutton;        /* Bouton de sortie */
  1443.      int        fsel_retry;            /* =YES si on veut retenter de donner un nom! */
  1444.     int        sauve_ok = NO0;    /* =YES si on a pu sauver le contenu */
  1445.  
  1446.     do
  1447.     {
  1448.          fsel_retry = NO0;    /* on ne veut pas encore retenter de donner un nom! */
  1449.  
  1450.         /*
  1451.          * Demande un nom de fichier: 
  1452.          */
  1453.          if( fsel_exinput( M_fs_iinpath, M_fs_iinsel, &fs_iexbutton, titre ) != 0)
  1454.        {    /*
  1455.             * S'il n'y a pas eu d'erreur pdt la s‚lection: 
  1456.             */
  1457.         
  1458.             graf_mouse(BUSYBEE, 0);        /* Change curseur souris */
  1459.             
  1460.             if (fs_iexbutton == 1)        /* Si on a cliqu‚ sur OK */
  1461.             {
  1462.                 if ( strlen( M_fs_iinsel ) == 0 )
  1463.                 {
  1464.                     fsel_retry = alert( PERR_NO_FILENAME );
  1465.                 }
  1466.                 else
  1467.                 {    /*
  1468.                      * Si on a donn‚ un nom de fichier: 
  1469.                      * Contr“le de l'extension:
  1470.                      */
  1471.         
  1472.                     if ( fsel_retry == 0 )   /* si extension OK */
  1473.                     {    /*
  1474.                          * Fixe chemin d'accŠs dans la var globale: 
  1475.                          */
  1476.         
  1477.                         strcpy ( G_filepath, M_fs_iinpath );
  1478.         
  1479.                         /*
  1480.                          * Il faut enlever le masque de s‚lection: 
  1481.                          */
  1482.                         M_path_end_adr=(char *)strrchr( G_filepath, '\\');
  1483.                         if ( M_path_end_adr == NULL )
  1484.                         {
  1485.                             fsel_retry = alert( PERR_INCORRECT_PATH );
  1486.                         }
  1487.                         else
  1488.                         {    /*
  1489.                              * Si le path SEMBLE correct
  1490.                              * Si on a trouv‚ l'extension: 
  1491.                              * On l'enlŠve: 
  1492.                              */
  1493.                             M_path_end_adr[0]='\0';        /* Path sans \ final */    
  1494.  
  1495.                             /*
  1496.                              * Fixe nom du fichier dans variable globale: 
  1497.                              */
  1498.                             strcpy( G_filename, M_fs_iinsel );
  1499.  
  1500.                             /*
  1501.                              * Sauvegarde proprement dite: 
  1502.                              */
  1503.                             sauve_ok = directsave_file( file_type, fta );    /* Sauvegarde */
  1504.                         }
  1505.                     }
  1506.                 }
  1507.             }
  1508.         }
  1509.     } while (fsel_retry == 1 );
  1510.  
  1511.     return    sauve_ok;
  1512. }
  1513.             
  1514.  
  1515.  
  1516. /*
  1517.  * -------------------------- CONFIGS  .INF  ----------------------------
  1518.  */
  1519.  
  1520.  
  1521.  
  1522. /*
  1523.  * save_inf(-)
  1524.  *
  1525.  * Purpose:
  1526.  * --------
  1527.  * Sauvegarde des paramŠtres-serveur dans fichier .INF
  1528.  *
  1529.  * History:
  1530.  * --------
  1531.  * fplanque: Created
  1532.  */
  1533. void    save_inf( FILE *fstream )
  1534. {
  1535.     /*
  1536.      * Sauve header: 
  1537.      */
  1538.     fputs( "Filename: STUT_ONE.INF\r\nContent : ParamŠtres-Serveur\r\n", fstream );
  1539.     fputs( M_header, fstream );
  1540.         
  1541.     /*
  1542.      * Sauve donn‚es: 
  1543.      */
  1544.     save_infdata( fstream );
  1545. }
  1546.  
  1547.  
  1548.  
  1549. /*
  1550.  *    ------------------------- CONFIGS  .INI  ----------------------------
  1551.  */
  1552.  
  1553.   
  1554.  
  1555. /*
  1556.  * save_ini(-)
  1557.  *
  1558.  * Purpose:
  1559.  * --------
  1560.  * Sauvegarde de la configuration dans fichier .INI
  1561.  *
  1562.  * History:
  1563.  * --------
  1564.  * fplanque: Created
  1565.  */
  1566. void    save_ini( FILE *fstream )
  1567. {
  1568.  
  1569.     /*
  1570.      * Sauve header: 
  1571.      */
  1572.     fputs( "Filename: STUT_ONE.INI\r\nContent : Configuration\r\n", fstream );
  1573.     fputs( M_header, fstream );
  1574.         
  1575.     /*
  1576.      * Sauve donn‚es: 
  1577.      */
  1578.     save_inidata( fstream );
  1579. }
  1580.  
  1581.  
  1582.  
  1583.  
  1584. /*
  1585.  *    ------------------------- ARBO ----------------------------
  1586.  */
  1587.  
  1588.   
  1589.  
  1590. /*
  1591.  * load_dirmap(-)
  1592.  *
  1593.  * Purpose:
  1594.  * --------
  1595.  * Chargement du dir_map
  1596.  *
  1597.  * History:
  1598.  * --------
  1599.  * 1993: fplanque: Created
  1600.  * 14.02.95: verified mallocs
  1601.  */
  1602. int    load_dirmap( 
  1603.             FILE         *        fstream, 
  1604.             unsigned * *    dir_map )
  1605. {
  1606.     unsigned        map_w, map_h;    /* Dimensions du MAP */
  1607.     size_t        map_elts;        /* Taille du MAP */
  1608.     unsigned    *    l_dir_map;        /* MAP */
  1609.     int            nb_objs;
  1610.     size_t        i;                /* Pointeur dans MAP */
  1611.  
  1612.     /*
  1613.      * Par d‚faut:
  1614.      */
  1615.     *dir_map = NULL;
  1616.  
  1617.     /*
  1618.      * Teste pr‚sence du MAP: 
  1619.      */
  1620.     if( ffind( fstream, "MAP:" ) == NULL )
  1621.     {    /*
  1622.          * On a pas trouv‚ le map:
  1623.          */
  1624.         return    NIL;        /* Chargement … ‚chou‚ */
  1625.     }
  1626.     
  1627.     /*
  1628.      * CHARGEMENT DU MAP: 
  1629.      * Charge dimensions: 
  1630.      */
  1631.     fread( &map_w, sizeof( unsigned ), 1, fstream );    /* Largeur */
  1632.     fread( &map_h, sizeof( unsigned ), 1, fstream );    /* Hauteur */
  1633.     map_elts = map_w * map_h;        /* Calcule taille n‚cessaire */
  1634.     /* TRACE3(" Map: %u*%u=%lu", map_w, map_h, map_elts ); */
  1635.  
  1636.     /*
  1637.      * Alloue le MAP: 
  1638.      */
  1639.     l_dir_map = (unsigned *) MALLOC( (2+map_elts) * sizeof( unsigned ) ); 
  1640.     if( l_dir_map == NULL )
  1641.     {    /*
  1642.          * Si pas assez de m‚moire: 
  1643.          */
  1644.         alert( NOMEM_OPENFILE );    /* Pas assez de mem pour ouvrir */
  1645.  
  1646.         return    NIL;        /* Chargement … ‚chou‚ */
  1647.     }
  1648.  
  1649.     /*
  1650.      * Allocation OK:
  1651.      * Fixe dimensions: 
  1652.      */
  1653.     /* TRACE1(" Dir Map: %lX", l_dir_map ); */
  1654.     l_dir_map[ 0 ] = map_w;        /* Largeur */
  1655.     l_dir_map[ 1 ] = map_h;        /* Hauteur */
  1656.     /*
  1657.      * Chargement du map: 
  1658.      */
  1659.     if( fread( &(l_dir_map[2]), sizeof( unsigned ), map_elts, fstream ) != map_elts )
  1660.     {    /*
  1661.          * Si on a pas pu tout charger: 
  1662.          */
  1663.         alert( BAD_FILEFMT );    /* Format de fichier non reconnu! */
  1664.  
  1665.         /*
  1666.          * En cas d'echec de chagement:
  1667.          * On libŠre le MAP: 
  1668.          */
  1669.         FREE( l_dir_map );
  1670.  
  1671.         return    NIL;        /* Chargement … ‚chou‚ */
  1672.     }
  1673.  
  1674.     /*
  1675.      * SI on a charg‚:
  1676.      * Calcule le nombre d'objets dans le MAP: 
  1677.      */
  1678.  
  1679.     nb_objs = 0;
  1680.     for( i=0 ; i<map_elts ; i++ )
  1681.     {    /*
  1682.          * Parcourt les cases: 
  1683.          */
  1684.         if( l_dir_map[ 2 + i ] != 0 )
  1685.         {    /*
  1686.              * Si la case contient un objet: 
  1687.              */
  1688.             nb_objs ++;        /* 1 objet de plus */
  1689.         }
  1690.     }
  1691.     
  1692.     /* TRACE1( " Nb objs in MAP=%d", nb_objs ); */
  1693.  
  1694.     /*
  1695.      * OK, c'est charg‚: 
  1696.      */
  1697.     *dir_map = l_dir_map;    /* Retourne Adresse du MAP */                
  1698.     return    nb_objs;            /* Nbre d'objets dans le map */
  1699. }
  1700.  
  1701.  
  1702.  
  1703. /*
  1704.  * load_inlinks(-)
  1705.  *
  1706.  * Purpose:
  1707.  * --------
  1708.  * Chargement des liens-IN
  1709.  *
  1710.  * History:
  1711.  * --------
  1712.  * 1993: fplanque: Created
  1713.  * 14.02.95: verified mallocs
  1714.  * 29.03.95m use of KEYWORD_LIST
  1715.  */
  1716. KEYWORD_LIST *    load_inlinks( 
  1717.                         FILE     *    fstream,
  1718.                         int        n_Version )
  1719. {
  1720.     /* 
  1721.      * Teste pr‚sence des liens IN: 
  1722.      */
  1723.     if( ffind( fstream, "IN:" ) != NULL )
  1724.     {    /*
  1725.          * Si on a trouv‚ l'IN: 
  1726.          * CHARGEMENT IN: 
  1727.          */
  1728.         KEYWORD_LIST *    liens_in = load_motsclefs( fstream, CMD_EVENT, n_Version );
  1729.         return            liens_in;
  1730.     }
  1731.  
  1732.     /*
  1733.      * On a pas pu charger: 
  1734.      */
  1735.     return    NULL;
  1736. }
  1737.  
  1738.  
  1739.  
  1740. /*
  1741.  * load_pagesarbo(-)
  1742.  *
  1743.  * Purpose:
  1744.  * --------
  1745.  * Chargement des pages arbo
  1746.  *
  1747.  * Suggest:
  1748.  * --------
  1749.  * Cette proc‚dure manque de tests pour d‚celler les erreurs
  1750.  * v‚rifier les mallocs
  1751.  *
  1752.  * History:
  1753.  * --------
  1754.  * fplanque: Created
  1755.  * 10.05.94: fplanque: ajout‚ paramŠtres sp‚ciaux
  1756.  * 16.12.94: charge direct ds datagroup; optimisations
  1757.  * 26.01.95: v0.03: params de liste d'affichage
  1758.  */
  1759. BOOL    load_pagesarbo(                 /* Out: FALSE0 si chargement a ‚chou‚ */
  1760.             FILE         *    fstream, 
  1761.             DATADIR     *    pDataDir,    /* In: DataDir ds lequel on charge */
  1762.             int            n_Version )    /* In: Version du fichier */
  1763. {
  1764.     /*
  1765.      * Compteur du nombre de pages charg‚es: 
  1766.      */
  1767.     int    nb_pages = 0;    /* Pas encore de page charg‚e */
  1768.  
  1769.     int    ctrl_car;        /* CaractŠre de contr“le */
  1770.  
  1771.     /*
  1772.      * Teste pr‚sence des pages: 
  1773.      */
  1774.     if( ffind( fstream, "PAGES:" ) == NULL )
  1775.     {    /*
  1776.           * On a pas trouv‚ les pages: 
  1777.           */
  1778.         alert( BAD_FILEFMT );    /* Format de fichier non reconnu! */
  1779.     }
  1780.     else
  1781.     {    /*
  1782.           * Si on a trouv‚ les pages: 
  1783.          * CHARGEMENT PAGES: 
  1784.          */
  1785.         DATAPAGE    *    pDataPage;
  1786.         PAGEARBO    *    pagearbo;                /* Donn‚es de la page en cours */
  1787.  
  1788.         while(    ctrl_car = getc( fstream ),
  1789.                      ctrl_car    == '>' )
  1790.         {    /*
  1791.              * Tant qu'il reste une page … charger:
  1792.              * Charge nom: 
  1793.              */
  1794.             load_str_tobuffer( fstream, 12 );        /* 12 car max */
  1795.  
  1796.             /* 
  1797.              * Cr‚e page: 
  1798.              */
  1799.             pDataPage = create_std_datapage( DTYP_ARBO, G_tmp_buffer ); 
  1800.  
  1801.             /*
  1802.              * Charge commentaire: 
  1803.              */
  1804.             pDataPage -> comment = load_String( fstream );
  1805.             
  1806.             /*
  1807.              * Chargement des donn‚es: 
  1808.              * -----------------------
  1809.              * Cr‚‚ la zone de stockage: 
  1810.              */
  1811.             pagearbo = (PAGEARBO *) MALLOC( sizeof( PAGEARBO ) ); 
  1812.             /*
  1813.              * Lie … la page: 
  1814.              */
  1815.             pDataPage -> data.pagearbo = pagearbo; 
  1816.  
  1817.             /* TRACE2(" Page ARBO: DtPg:%lX   PgArb:%lX", pDataPage, pDataPage -> data.pagearbo ); */
  1818.  
  1819.             /*
  1820.              * Donn‚e non sauvegard‚e: Chemin d'accŠs complet 
  1821.              */
  1822.             pagearbo -> chemin = page_fullpath_old( find_datagroup_byType( DTYP_ARBO ), pDataPage -> nom ); 
  1823.  
  1824.             /*
  1825.              * Charge no de fonction: 
  1826.              */
  1827.             fread( &( pagearbo -> fnct_no ), sizeof( pagearbo -> fnct_no ), 1, fstream );
  1828.             /*
  1829.              * Donn‚e non sauvegard‚e: sp‚cifs fonction 
  1830.              */
  1831.             pagearbo    -> fnct_spec = afnct_spec( pagearbo -> fnct_no );    /* Sp‚cifs associ‚es */
  1832.             /*
  1833.              * Charge position dans le MAP: 
  1834.              */
  1835.             fread( &( pagearbo -> map_pos_x ), sizeof( pagearbo -> map_pos_x ), 1, fstream );
  1836.             fread( &( pagearbo -> map_pos_y ), sizeof( pagearbo -> map_pos_y ), 1, fstream );
  1837.     
  1838.             /*
  1839.              * Pages-‚cran: 
  1840.              */
  1841.             pagearbo -> pages_ecran = load_atextpar( fstream );
  1842.  
  1843.             /*
  1844.              * Champs de sortie/output: 
  1845.              */
  1846.             pagearbo -> output_fields = load_fieldpar( fstream, SERIALIZE_OUTPUTFPAR, n_Version );
  1847.             /*
  1848.              * ParamŠtres de liste:
  1849.              */
  1850.             if( n_Version >= 0003 )
  1851.             {
  1852.                 pagearbo -> pArboListPars = AListPars_Load( fstream );
  1853.             }
  1854.             else
  1855.             {
  1856.                 pagearbo -> pArboListPars = NULL;
  1857.             }
  1858.  
  1859.             /*
  1860.              * Champs de saisie/input: 
  1861.              */
  1862.             pagearbo -> input_fields = load_fieldpar( fstream, SERIALIZE_INPUTFPAR, n_Version );
  1863.  
  1864.             /*
  1865.              * Bases de donn‚es associ‚es: 
  1866.              */
  1867.             pagearbo -> databases = load_atextpar( fstream );
  1868.  
  1869.             /*
  1870.              * -----------
  1871.              * Liens-arbo: 
  1872.              * -----------
  1873.              */
  1874.             pagearbo -> p_Events = load_motsclefs( fstream, CMD_EVENT, n_Version );
  1875.     
  1876.             /*
  1877.              * ---------------------------------------
  1878.              * ParamŠtres sp‚cifiques au type de page: 
  1879.              * ---------------------------------------
  1880.              */
  1881.             pagearbo -> special_par = load_specialpar( fstream, pagearbo -> fnct_no );
  1882.  
  1883.             /*
  1884.              * -----------
  1885.              * Mots clefs: 
  1886.              * -----------
  1887.              */
  1888.             pagearbo -> p_MotsClefs = load_motsclefs( fstream, CMD_KEYWORD, n_Version );
  1889.         
  1890.             /*
  1891.              * Init statut sauvegarde: sauv‚e
  1892.              * Pas de redraw, car page pas encore ajout‚e ds DATAGROUP
  1893.              */
  1894.             dataPage_setSavState( pDataPage, SSTATE_SAVED ); 
  1895.  
  1896.  
  1897.             /*
  1898.              * Ajoute page ds DataDir: 
  1899.              */
  1900.             attach_new_data( pDataDir, pDataPage ); 
  1901.              
  1902.             /*
  1903.              * On a charg‚ une page de plus: 
  1904.              */
  1905.             nb_pages ++;
  1906.  
  1907.         }
  1908.  
  1909.         /* TRACE1(" Charg‚: %d pages", nb_pages ); */
  1910.  
  1911.         /*
  1912.          * Contr“le si le chargement s'est bien effectu‚ jusqu'au bout: 
  1913.          */
  1914.         if ( ctrl_car == 0xFF )
  1915.         {    /*
  1916.              * Chargement OK: 
  1917.              */
  1918.             return    TRUE_1;
  1919.         }
  1920.  
  1921.         /*
  1922.          * Sinon, le chargement a foir‚: 
  1923.          */
  1924.         alert( UNEXPECTED_FFMT );        /* Fichier endommag‚ */
  1925.         
  1926.         /*
  1927.          * Effacement des pages charg‚es: 
  1928.          */
  1929.         clearout_datadir( pDataDir );
  1930.     
  1931.     }
  1932.  
  1933.     /*
  1934.      * On a pas pu charger:  
  1935.      */
  1936.     return    FALSE0;    
  1937. }
  1938.  
  1939.  
  1940.  
  1941.  
  1942. /*
  1943.  * load_atextpar(-)
  1944.  *
  1945.  * Purpose:
  1946.  * --------
  1947.  * Charge paramŠtres textuels
  1948.  *
  1949.  * History:
  1950.  * --------
  1951.  * 1993: fplanque: Created
  1952.  * 14.02.95: verified mallocs
  1953.  */
  1954. ARBO_TEXTPAR *    load_atextpar( 
  1955.                         FILE *    fstream )
  1956. {
  1957.     size_t                load_res;            /* R‚sultat de l'op‚ration de chargement */
  1958.     unsigned                fnct_no = 0;        /* Num‚ro de fonction */
  1959.     ARBO_TEXTPAR    *    first;                /* 1er paramŠtre */
  1960.     ARBO_TEXTPAR    **    pred = &first;        /* Adr Ptr sur prochain ds le pr‚c‚dent */
  1961.     ARBO_TEXTPAR    *    pATextPar_Curr;    /* Param courant */
  1962.  
  1963.     /*
  1964.      * Charge paramŠtres: 
  1965.      */
  1966.     while
  1967.     ( 
  1968.         load_res = fread( &fnct_no, sizeof( unsigned ), 1, fstream ),
  1969.         load_res == 1 /*PasFinFichier*/  &&  fnct_no != 0xFFFF /*PasFinListe*/
  1970.     )
  1971.     {    /*
  1972.          * Tant qu'il y a des paramŠtres … charger: 
  1973.          * Cr‚e le paramŠtre: 
  1974.          */
  1975.         pATextPar_Curr = (ARBO_TEXTPAR *) MALLOC( sizeof(ARBO_TEXTPAR) );
  1976.         
  1977.         /*
  1978.          * Liaison avec le pr‚c‚dent: 
  1979.          */
  1980.         *pred = pATextPar_Curr;    /* Indique adresse du param courant */
  1981.  
  1982.         /*
  1983.          * Fixe no de fonction: 
  1984.          */
  1985.         pATextPar_Curr -> fnct_no = fnct_no;
  1986.     
  1987.         /*
  1988.          * Charge paramŠtre textuel: 
  1989.          */
  1990.         pATextPar_Curr -> nom = load_String( fstream );
  1991.         
  1992.         /*
  1993.          * Sauve adresse du ptr dans lequel 
  1994.          * il va falloir placer l'adr du param suivant: 
  1995.          */
  1996.         pred = &( pATextPar_Curr -> next );            
  1997.     }
  1998.  
  1999.     /*
  2000.      * Signale fin de la liste: 
  2001.      */
  2002.     *pred = NULL;        /* Plus de param aprŠs */
  2003.  
  2004.     /*
  2005.      * Contr“le si le chargement est ok: 
  2006.      */
  2007.     if( fnct_no != 0xFFFF )
  2008.     {    /*
  2009.           * S'il y a eu un problŠme: 
  2010.          * Efface le d‚but de liste: 
  2011.          */
  2012.         Delete_TextParList( first );
  2013.         first = NULL;    /* Plus de liste */
  2014.     }
  2015.  
  2016.     /*
  2017.      * Renvoie l'adresse du 1er param: 
  2018.      */
  2019.     return    first;
  2020. }
  2021.  
  2022.  
  2023.  
  2024.  
  2025.  
  2026. /*
  2027.  * load_specialpar(-)
  2028.  *
  2029.  * Purpose:
  2030.  * --------
  2031.  * Charge paramŠtres sp‚cifiques au type de page:
  2032.  *
  2033.  * History:
  2034.  * --------
  2035.  * fplanque: Created
  2036.  * 27.03.95: param fnct; impl‚mentation FILSEL
  2037.  */
  2038. ARBO_SPECIALPAR load_specialpar(        /* Out: Params charg‚, NULL si pas de params */
  2039.                         FILE *    fstream,    /* In:  Fichier depuis lequel on charge */
  2040.                         int        n_fnct )    /* In:  Fonction de la page */
  2041. {
  2042.     size_t                st_result;
  2043.     size_t                st_ParLength;
  2044.     ARBO_SPECIALPAR     SpecPars;
  2045.     
  2046.     SpecPars.data = NULL;
  2047.     
  2048.     /* 
  2049.      * Charge Longueur des parametres: 
  2050.      */
  2051.     st_result = fread( &st_ParLength, sizeof( size_t ), 1, fstream );
  2052.     
  2053.     if( st_result > 0  && st_ParLength > 0 )
  2054.     {    /*
  2055.         * S'il y a des paramŠtres … charger
  2056.          */
  2057.         switch( n_fnct )
  2058.         {
  2059.             case    FA_LECT_MSG:
  2060.                 SpecPars.lecture = MALLOC( sizeof( LECTURE_PAR ) );
  2061.                 fread( SpecPars.lecture, 1, st_ParLength, fstream );
  2062.                 break;
  2063.     
  2064.             case    FA_FILESEL:
  2065.                 SpecPars.filesel = MALLOC( sizeof( FILESEL_PAR ) );
  2066.                 fread( SpecPars.filesel, 1, st_ParLength, fstream );
  2067.                 SpecPars.filesel -> pMsz_RootPath = load_String( fstream );
  2068.                 break;
  2069.         }
  2070.     }
  2071.     
  2072.     return    SpecPars;
  2073. }
  2074.  
  2075.  
  2076.  
  2077.  
  2078. /*
  2079.  * load_arbo(-)
  2080.  *
  2081.  * Purpose:
  2082.  * --------
  2083.  * Chargement d'un fichier arborescence
  2084.  *
  2085.  * History:
  2086.  * --------
  2087.  * 1993: fplanque: Created
  2088.  * 15.07.94: fplanque: appelle maintenant create_EmptyDataDir()
  2089.  * 22.01.95: gŠre no de version
  2090.  * 14.02.95: verified mallocs
  2091.  */
  2092. DATADIR    *    load_arbo( 
  2093.                     FILE *    fstream )
  2094. {
  2095.     int            n_Version;
  2096.     unsigned *    dir_map;
  2097.     int            nb_objs;
  2098.  
  2099.     /* 
  2100.      * Contr“le le header:
  2101.      */
  2102.     n_Version = head_control( fstream, FS_ARBO, "Arbo" );
  2103.     /* TRACE1(" Version arbo: %X", n_Version ); */
  2104.     
  2105.     /*
  2106.      * Contr“le le no de version:
  2107.      */
  2108.     switch( n_Version )
  2109.     {
  2110.         case    0x0002:
  2111.         case    0x0003:
  2112.         case    0x0004:
  2113.         case    0x0005:    /* 31.03.95 */
  2114.             break;
  2115.             
  2116.         case    ERROR_1:
  2117.             return    NULL;        /* Le chargement ne s'est pas effectu‚ */
  2118.  
  2119.         default:
  2120.             alert( BAD_VERSION );
  2121.             return    NULL;        /* Le chargement ne s'est pas effectu‚ */
  2122.     }
  2123.     
  2124.     /* 
  2125.      * Si le header est correct:
  2126.      * Charge dir-map: 
  2127.      */
  2128.     nb_objs = load_dirmap( fstream, &dir_map );
  2129.  
  2130.     if( nb_objs >= 0 && dir_map != NULL )
  2131.     {    /*
  2132.          * Si chargement dir-map ok: 
  2133.          * Chargement des liens-IN: 
  2134.          */
  2135.         KEYWORD_LIST *    liens_in = load_inlinks( fstream, n_Version );
  2136.         
  2137.         if( liens_in != NULL )
  2138.         {    /* 
  2139.              * Si chargement liens-in ok: 
  2140.              * ---------------------
  2141.              * Chargement des pages: 
  2142.              * ---------------------
  2143.              */
  2144.             DATADIR     *    pDataDir = create_EmptyDataDir( find_datagroup_byType( DTYP_ARBO ), NULL );
  2145.  
  2146.             if( load_pagesarbo( fstream, pDataDir, n_Version ) )
  2147.             {    /* 
  2148.                  * Si chargement des pages ok: 
  2149.                  * Cr‚ation du ROOT-DIR: 
  2150.                  */
  2151.                 DIRSPEC * dir_spec;
  2152.  
  2153.                 /*
  2154.                  * Cr‚ation des dir_spec: 
  2155.                  */
  2156.                 dir_spec = (DIRSPEC *) MALLOC( sizeof( DIRSPEC ) );
  2157.                 dir_spec -> liens_in  = liens_in;    /* Liens IN */
  2158.                 dir_spec -> max_objs     = 0;                /* Trait‚ plus tard... */
  2159.                 dir_spec -> nb_objs     = nb_objs;        /* Nombre d'objets ds MAP */
  2160.                 dir_spec -> max_iblks = 0;                /* Trait‚ plus tard... */
  2161.                 dir_spec -> nb_iblks     = pDataDir -> nb_elts;    /* Nbre d'objets n‚cessitant un ICONBLK */
  2162.                                                                 /* nb_iblks = nbre depages arbo = nbre d'ic“nes (pas des IMAGEs) */
  2163.                 dir_spec -> dir_map = dir_map;        /* MAP */
  2164.  
  2165.                 /* TRACE2(" pages: nb_objs=%d  nb_iblks=%d ", dir_spec -> nb_objs, dir_spec -> nb_iblks ); */
  2166.  
  2167.                 /*
  2168.                  * Relie Dir_spec au DATADIR
  2169.                  */                        
  2170.                 pDataDir -> dir_spec = dir_spec;    /* Sp‚cifications sp‚ciales!!! */
  2171.  
  2172.                 /*
  2173.                  * Chargement termin‚ ok 
  2174.                  */
  2175.                 return    pDataDir;        /* Chargement effectu‚ */        
  2176.  
  2177.             }
  2178.             
  2179.             /*
  2180.              * En cas d'‚ch‚c:
  2181.              * -Kill DataDir
  2182.              * -Liberation des liens_in 
  2183.              */
  2184.             DataDir_Destruct( pDataDir ); 
  2185.             free_KeyWordList( liens_in );
  2186.  
  2187.         }
  2188.         
  2189.         /*
  2190.          * En cas d'‚chec, efface le dir_map: 
  2191.          */
  2192.         FREE( dir_map );
  2193.     }
  2194.  
  2195.     /* 
  2196.      * Si le chargement … ‚chou‚: 
  2197.      */
  2198.     return    NULL;        /* Le chargement ne s'est pas effectu‚ */
  2199. }
  2200.  
  2201.  
  2202.  
  2203. /*
  2204.  * save_arbo(-)
  2205.  *
  2206.  * Purpose:
  2207.  * --------
  2208.  * Sauvegarde d'un dossier arbo
  2209.  *
  2210.  * History:
  2211.  * --------
  2212.  * 1993: fplanque: Created
  2213.  * 10.05.94: fplanque: ajout‚ paramŠtres sp‚ciaux
  2214.  * 24.11.94: version 0.01
  2215.  * 26.01.95: v0.03: sauve params liste
  2216.  * 15.03.95: v0.04: mots clefs ‚tendus aux commandes
  2217.  * 31.03.95: v0.05: liens-arbo>>>events traites comme mots clef
  2218.  */
  2219. int    save_arbo( 
  2220.             FILE         *    fstream, 
  2221.             DATADIR    *    datadir )
  2222. {
  2223.     DIRSPEC    *    dir_spec = datadir -> dir_spec;    /* Sp‚cifications compl‚mentaires */
  2224.     unsigned    *    dir_map = dir_spec -> dir_map;    /* Map */
  2225.     unsigned        map_w = dir_map[ 0 ];
  2226.     unsigned        map_h = dir_map[ 1 ];
  2227.     DATAPAGE    *    datapage = datadir -> data_start;    /* 1Šre page */
  2228.     PAGEARBO    *    pagearbo;        /* Donn‚es arbo */
  2229.     int            n_NoFnct;        /* No de fonction d'une page */
  2230.  
  2231.     /*
  2232.      * Sauve header: 
  2233.      */
  2234.     fputs( "Filename: ARBO.STU\r\nContent : Arbo\r\n", fstream );
  2235.     fputs( "Applicat: Stut One\r\nCompatib: 0.05\r\nData... :\r\n", fstream );
  2236.  
  2237.     /*
  2238.      * Sauve MAP: 
  2239.      */
  2240.     fputs( "MAP:\r\n", fstream );
  2241.     fwrite( dir_map, sizeof( unsigned ), 2 + map_w * map_h, fstream );
  2242.  
  2243.     /*
  2244.      * Sauve paramŠtres IN: 
  2245.      */
  2246.     fputs( "\r\nIN:\r\n", fstream );
  2247.     save_motsclef( fstream, dir_spec -> liens_in );        /* Sauve liens arbo */
  2248.  
  2249.     /* 
  2250.      * Sauve pages: 
  2251.      */
  2252.     fputs( "\r\nPAGES:\r\n", fstream );
  2253.     while( datapage != NULL )
  2254.     {
  2255.         /* 
  2256.          * Sauve octet de contr“le indiquant le d‚but d'une page: 
  2257.          */
  2258.         putc( '>', fstream );
  2259.  
  2260.         /* 
  2261.          * Sauve nom de la page: 
  2262.          */
  2263.         save_String( datapage -> nom, fstream );    /* Nom */
  2264.     
  2265.         /* 
  2266.          * Sauve commentaire: 
  2267.          */
  2268.         save_String( datapage -> comment, fstream );    /* Commentaire */
  2269.  
  2270.         /* 
  2271.          * Donn‚es: 
  2272.          */
  2273.         pagearbo = datapage -> data.pagearbo;    /* Ptr sur donn‚es arbo */
  2274.     
  2275.         /* 
  2276.          * No de fonction: 
  2277.          */
  2278.         n_NoFnct = pagearbo -> fnct_no;
  2279.         fwrite( &n_NoFnct, sizeof( int ), 1, fstream );
  2280.         fwrite( &(pagearbo -> map_pos_x), sizeof( int ), 1, fstream );
  2281.         fwrite( &(pagearbo -> map_pos_y), sizeof( int ), 1, fstream );
  2282.     
  2283.         /*
  2284.          * Pages ‚cran: 
  2285.          */
  2286.         save_atextpar( fstream, pagearbo -> pages_ecran );
  2287.  
  2288.         /*
  2289.          * Champs de sortie: 
  2290.          */
  2291.         save_fields( fstream, pagearbo -> output_fields, SERIALIZE_OUTPUTFPAR );
  2292.         /* 
  2293.          * ParamŠtres de liste:
  2294.          */
  2295.         AListPars_Save( pagearbo -> pArboListPars, fstream );
  2296.  
  2297.         /*
  2298.          * Champs de saisie: 
  2299.          */
  2300.         save_fields( fstream, pagearbo -> input_fields, SERIALIZE_INPUTFPAR );
  2301.  
  2302.         /*
  2303.          * Bases de donn‚es utilis‚es: 
  2304.          */
  2305.         save_atextpar( fstream, pagearbo -> databases );
  2306.  
  2307.         /*
  2308.          * Liens arbo: 
  2309.          */
  2310.         save_motsclef( fstream, pagearbo -> p_Events );
  2311.  
  2312.         /*
  2313.          * ParamŠtres sp‚ciaux de la page: 
  2314.          */
  2315.         save_specialpar( fstream, pagearbo );
  2316.  
  2317.         /*
  2318.          * Mots clef: 
  2319.          */
  2320.         save_motsclef( fstream, pagearbo -> p_MotsClefs );
  2321.         
  2322.         /*
  2323.          * Passe … la page suivante: 
  2324.          */
  2325.         datapage = datapage -> next;    
  2326.     }
  2327.  
  2328.     /*
  2329.      * Sauve octet de contr“le indiquant qu'il n'y a plus de page: 
  2330.      */
  2331.     putc( 0xFF, fstream );
  2332.  
  2333.     return    YES1;        /* La sauvegarde s'est bien effectu‚e */
  2334. }
  2335.  
  2336.  
  2337.  
  2338.  
  2339. /*
  2340.  * save_atextpar(-)
  2341.  *
  2342.  * Purpose:
  2343.  * --------
  2344.  * Sauve paramŠtres textuels
  2345.  *
  2346.  * History:
  2347.  * --------
  2348.  * 1993: fplanque: Created
  2349.  */
  2350. void    save_atextpar( 
  2351.             FILE *fstream, 
  2352.             ARBO_TEXTPAR *atextpar )
  2353. {
  2354.     /*
  2355.      * Sauve paramŠtres: 
  2356.      */
  2357.     while( atextpar != NULL )
  2358.     {    /* Tant qu'il y a des paramŠtres … sauver */
  2359.         /* Sauve no de fonction: */
  2360.         fwrite( &(atextpar -> fnct_no), sizeof(int), 1, fstream );
  2361.         /* Sauve texte: */
  2362.         save_String( atextpar -> nom, fstream );
  2363.         /* Passe au paramŠtre suivant: */
  2364.         atextpar = atextpar -> next;
  2365.     }
  2366.  
  2367.     /*
  2368.      * Fin de la liste: 
  2369.      */
  2370.     fputc( 0xFF, fstream );        /* Ajoute 0xFFFF pour signaler */
  2371.     fputc( 0xFF, fstream );        /* La fin de la liste */
  2372. }
  2373.  
  2374.  
  2375.  
  2376. /*
  2377.  * save_fields(-)
  2378.  *
  2379.  * Purpose:
  2380.  * --------
  2381.  * Sauve paramŠtres des champs de sortie
  2382.  *
  2383.  * History:
  2384.  * --------
  2385.  * 1993: fplanque: Created
  2386.  * 17.12.94: new arg SerializeType
  2387.  */
  2388. void    save_fields( 
  2389.             FILE                 *    fstream, 
  2390.             ARBO_FIELDPARS *    field_params, 
  2391.             SERIALIZE_TYPE        SerializeType )    /* In: Type de donn‚es … charger */
  2392. {
  2393.     /*
  2394.      * Sauve paramŠtres: 
  2395.      */
  2396.     while( field_params != NULL )
  2397.     {    /*
  2398.          * Tant qu'il y a des paramŠtres … sauver 
  2399.          */
  2400.         switch( SerializeType )
  2401.         {
  2402.             case    SERIALIZE_INPUTFPAR:
  2403.                 InputField_Save( &(field_params -> data.input), fstream );
  2404.                 break;
  2405.                 
  2406.             case    SERIALIZE_OUTPUTFPAR:
  2407.                 OutputField_Save( &(field_params -> data.output), fstream );
  2408.                 break;
  2409.                 
  2410.             default:
  2411.                 ping();
  2412.         }
  2413.  
  2414.         /*
  2415.          * Passe au paramŠtre suivant: 
  2416.          */
  2417.         field_params = field_params -> next;
  2418.     }
  2419.  
  2420.     /* 
  2421.      * Fin de la liste 
  2422.      */
  2423.     fputc( 0xFF, fstream );        /* Ajoute 0xFFFF pour signaler */
  2424.     fputc( 0xFF, fstream );        /* La fin de la liste */
  2425. }
  2426.  
  2427.  
  2428.  
  2429. /*
  2430.  * load_fieldpar(-)
  2431.  *
  2432.  * Purpose:
  2433.  * --------
  2434.  * Charge paramŠtres des champs de saisie
  2435.  *
  2436.  * History:
  2437.  * --------
  2438.  * 1993: fplanque: Created
  2439.  * 24.11.94: nouveau code de chargement aprŠs fnct_no (meilleure immunit‚ aux modifs et meilleure portabilit‚)
  2440.  * 17.12.94: new arg  SerializeType
  2441.  */
  2442. ARBO_FIELDPARS *    load_fieldpar( 
  2443.             FILE             *    fstream,
  2444.             SERIALIZE_TYPE    SerializeType,    /* In: Type de donn‚es … charger */
  2445.             int                n_Version)        /* In: version de fichier */
  2446. {
  2447.     /*
  2448.      * Variables: 
  2449.      */
  2450.     size_t            load_res;        /* R‚sultat de l'op‚ration de chargement */
  2451.     unsigned            fnct_no = 0;    /* Num‚ro de fonction */
  2452.     ARBO_FIELDPARS    * first;            /* 1er paramŠtre */
  2453.     ARBO_FIELDPARS    ** pred = &first;    /* Adr Ptr sur prochain ds le pr‚c‚dent */
  2454.     ARBO_FIELDPARS    * current;        /* Param courant */
  2455.  
  2456.     /*
  2457.      * Charge paramŠtres: 
  2458.      */
  2459.     while
  2460.     ( 
  2461.         load_res = fread( &fnct_no, sizeof( int ), 1, fstream ),
  2462.         load_res == 1 /*PasFinFichier*/  &&  fnct_no != 0xFFFF /* PasFinListe */
  2463.     )
  2464.     {    /*
  2465.          * Tant qu'il y a des paramŠtres … charger: 
  2466.          */
  2467.         fseek( fstream, - sizeof( int ), SEEK_CUR );
  2468.  
  2469.         switch( SerializeType )
  2470.         {
  2471.             case    SERIALIZE_INPUTFPAR:
  2472.                 current = MALLOC( sizeof( void * ) + sizeof( INPUT_FPAR ) );
  2473.                 InputField_Load( &(current -> data.input), fstream, n_Version );
  2474.                 break;
  2475.                 
  2476.             case    SERIALIZE_OUTPUTFPAR:
  2477.                 current = MALLOC( sizeof( void * ) + sizeof( OUTPUT_FPAR ) );
  2478.                 OutputField_Load( &(current -> data.output), fstream, n_Version );
  2479.                 break;
  2480.                 
  2481.             default:
  2482.                 ping();
  2483.         }
  2484.  
  2485.         /*
  2486.          * Liaison avec le pr‚c‚dent: 
  2487.          */
  2488.         *pred = current;    /* Indique adresse du param courant */
  2489.  
  2490.         /*
  2491.          * Sauve adresse du ptr dans lequel il va falloir placer l'adr du param suivant: 
  2492.          */
  2493.         pred = &( current -> next );            
  2494.     }
  2495.  
  2496.     /*
  2497.      * Signale fin de la liste: 
  2498.      */
  2499.     *pred = NULL;        /* Plus de param aprŠs */
  2500.  
  2501.     /*
  2502.      * Contr“le si le chargement est ok: 
  2503.      */
  2504.     if( fnct_no != 0xFFFF )
  2505.     {    /*
  2506.          * S'il y a eu un problŠme: 
  2507.          * Efface le d‚but de liste: 
  2508.          */
  2509.         Delete_SingleLinkList( first );
  2510.         first = NULL;    /* Plus de liste */
  2511.     }
  2512.  
  2513.     /*
  2514.      * Renvoie l'adresse du 1er param: 
  2515.      */
  2516.     return    first;
  2517. }
  2518.  
  2519.  
  2520.  
  2521.  
  2522. /*
  2523.  * save_specialpar(-)
  2524.  *
  2525.  * Purpose:
  2526.  * --------
  2527.  * Sauve paramŠtres sp‚ciaux d'une page
  2528.  *
  2529.  * Algorythm:
  2530.  * ----------  
  2531.  * Sauve longueur puis paramŠtres: 
  2532.  *
  2533.  * Notes:
  2534.  * ------
  2535.  * La longueur … sauver peut ˆtre nulle.
  2536.  *
  2537.  * History:
  2538.  * --------
  2539.  * 10.05.94: fplanque: Created
  2540.  * 27.03.95: changed everything
  2541.  */
  2542. void    save_specialpar( 
  2543.             FILE         *    fstream, 
  2544.             PAGEARBO    *    pArboPg )
  2545. {
  2546.     size_t    size_ParSize;    
  2547.  
  2548.     switch( pArboPg -> fnct_no )
  2549.     {    
  2550.         case FA_LECT_MSG:
  2551.             size_ParSize = sizeof( LECTURE_PAR );
  2552.             fwrite( &size_ParSize, sizeof( size_t ), 1, fstream );
  2553.             fwrite( pArboPg -> special_par.lecture, 1, size_ParSize, fstream );
  2554.             break;
  2555.             
  2556.         case FA_FILESEL:
  2557.             size_ParSize = sizeof( FILESEL_PAR ) - sizeof( char* );
  2558.             fwrite( &size_ParSize, sizeof( size_t ), 1, fstream );
  2559.             fwrite( pArboPg -> special_par.filesel, 1, size_ParSize, fstream );
  2560.             save_String( pArboPg -> special_par.filesel -> pMsz_RootPath, fstream );
  2561.             break;
  2562.  
  2563.         default:
  2564.             size_ParSize = 0;
  2565.             fwrite( &size_ParSize, sizeof( size_t ), 1, fstream );
  2566.     }
  2567. }
  2568.  
  2569.  
  2570.  
  2571. /*
  2572.  * ------------------------ DATAGROUPS ----------------------------
  2573.  */
  2574.  
  2575.  
  2576.  
  2577. /*
  2578.  * save_datagroup(-)
  2579.  *
  2580.  * Purpose:
  2581.  * --------
  2582.  * Sauvegarde d'un dossier de textes
  2583.  *
  2584.  * History:
  2585.  * --------
  2586.  * 19.06.94: fplanque: Created based on save_datas()
  2587.  * 14.12.94: Ne sauve que les textes ayant ‚t‚ modifi‚es
  2588.  * 14.12.94: sauve commentaires, ne rajoute plus d'extension par d‚faut
  2589.  * 15.12.94: changed to general function load_datagroup(); ne sauve pas le header
  2590.  * 25.03.95: sauve les fichires qui n'existent pas encore meme s'il ne portent pas de modifs
  2591.  */
  2592. int    save_datagroup(
  2593.             FILE             *    fstream,            /* In: Fichier ds lequel on sauve */
  2594.             const char    *    cpsz_FileName,    /* In: Nom du fichier, pour cr‚er dossier */
  2595.             const char    *    cpsz_Instruct,    /* In: Instruction indiquant un nom de fichier datapage */
  2596.             int                n_fileType,        /* In: Type du fichier qu'on sauve */
  2597.             DATADIR        *    pDataDir )        /* In: Dossier racine de l'arborescence … sauver */
  2598. {
  2599.     FILE            *    fileStream;
  2600.     char            *    cpsz_PageName;
  2601.     DATAPAGE        *    pDataPage = pDataDir -> data_start;    /* 1Šre page */
  2602.     
  2603.     strcpy( G_tmp_buffer, cpsz_FileName );
  2604.     erase_extension( G_tmp_buffer );
  2605.  
  2606.     if( chdir( G_tmp_buffer ) != 0 )
  2607.     {    /*
  2608.          * On a pas pu aller dans le directory:
  2609.          * On va le cr‚er:
  2610.          */
  2611.         if( Dcreate( G_tmp_buffer ) < 0 )
  2612.         {
  2613.             alert( DISK_CANTCREATEDIR );
  2614.             return    NO0;
  2615.         }
  2616.  
  2617.         if( chdir( G_tmp_buffer ) != 0 )
  2618.         {
  2619.             alert( DISK_CANTENTERDIR );
  2620.             return    NO0;
  2621.         }
  2622.  
  2623.     }
  2624.  
  2625.     /*
  2626.      * Sauve objets (datapages): 
  2627.      */
  2628.     while( pDataPage != NULL )
  2629.     {
  2630.         /*
  2631.          * Sauve nom de la page:
  2632.          */
  2633.         cpsz_PageName = pDataPage -> nom;        
  2634.         fprintf( fstream, "%s %s", cpsz_Instruct, cpsz_PageName );    /* Sauve Nom */
  2635.     
  2636.         /*
  2637.          * Sauve commentaire en tant que commentaire: filename    ! comment : 
  2638.          */
  2639.         if( pDataPage -> comment != NULL ) 
  2640.         { 
  2641.             fputs( "  ! ", fstream );                     /* Entete commentaire */
  2642.             fputs( pDataPage -> comment, fstream );    /* Commentaire */
  2643.         }
  2644.  
  2645.         fputc( '\r', fstream );                    /* CR */
  2646.         fputc( '\n', fstream );                    /* LF */
  2647.  
  2648.         /*
  2649.          * V‚rifie si cette page a ‚t‚ modifi‚e
  2650.          * ou si la page existe en RAM mais pas sur Disque (suite … une importation)
  2651.          */
  2652.         if( pDataPage -> DataState.sstate == SSTATE_MODIFIED
  2653.             || ! File_Exists( cpsz_PageName ) )
  2654.         {    /*
  2655.              * Cette datapage a ‚t‚ modifi‚e: 
  2656.              * Sauve la datapage dans un fichier ind‚pendant: 
  2657.              * Ouvre un fichier: 
  2658.              */
  2659.             fileStream = fopen( cpsz_PageName, "wb" );
  2660.             if ( fileStream == NULL )
  2661.             {  /* 
  2662.                  * Si on a pas pu ouvrir 
  2663.                  */
  2664.                 if( errno != 5 )
  2665.                 {    /*
  2666.                      * Si ce n'est pas une erreur de protection  (qui b‚n‚ficie d'une alerte TOS automatique ) 
  2667.                      */
  2668.                     alert( errno );
  2669.                 }
  2670.                 /*
  2671.                  * La sauvegarde … ‚chou‚: 
  2672.                  */
  2673.                 return    NO0;
  2674.             }
  2675.  
  2676.             /*
  2677.              * Si on a pu ouvrir le fichier: 
  2678.              */
  2679.             switch( n_fileType )
  2680.             {
  2681.                 case    FS_DATAS:
  2682.                     save_DBtoDXF( fileStream, cpsz_PageName, pDataPage );
  2683.                     break;
  2684.     
  2685.                 case    FS_TEXTES:
  2686.                     save_DataBlock( fileStream, pDataPage -> data.dataBlock, FEMODE_SINGLE );
  2687.                     break;
  2688.                     
  2689.                 default:
  2690.                     ping();
  2691.             }
  2692.  
  2693.             /*
  2694.              * Referme le fichier: 
  2695.              */
  2696.             if( fclose( fileStream ) != 0 )
  2697.             {
  2698.                 alert( errno );
  2699.             }
  2700.         }
  2701.         
  2702.         /*
  2703.          * Passe … la page suivante: 
  2704.          */
  2705.         pDataPage = pDataPage -> next;    
  2706.     }
  2707.  
  2708.     return    YES1;        /* La sauvegarde s'est bien effectu‚e */
  2709. }
  2710.  
  2711.  
  2712.  
  2713. /*
  2714.  * load_datagroup(-)
  2715.  *
  2716.  * Purpose:
  2717.  * --------
  2718.  * Chargement d'un DATAGROUP standard
  2719.  *
  2720.  * History:
  2721.  * --------
  2722.  * 19.06.94: fplanque: Created based on load_datas()
  2723.  * 11.08.94: fplanque: SSTATE_SAVED
  2724.  * 14.12.94: charge commentaires
  2725.  * 16.12.94: utilise attach_new_data()
  2726.  */
  2727. int    load_datagroup( 
  2728.             FILE            *    fstream,         /* In: Fichier depuis lequel on charge */
  2729.             const char    *    cpsz_FileName,    /* In: Nom du fichier catalogue -> dossier de sauvegarde des fichiers ind‚pendants */
  2730.             char            *    pS_section,        /* In: Nom de la section dans laquelle on charge */
  2731.             char            *    pS_instruct,    /* In: Instruction indiquant un nom de fichier datapage */
  2732.             int                n_fileType,        /* In: Type du fichier qu'on charge */
  2733.             DATADIR        *    datadir )        /* In: dossier dans lequel on charge */
  2734. {
  2735.     DATAPAGE        *    curr_page;                /* Page en cours de chargement */
  2736.     FILE            *    datastream;                /* Stream du fichier contenant les donn‚es de la base courante */
  2737.     int                nb_dataPages = 0;        /* Nombre de bases charg‚es */
  2738.     char            *    instr;                    /* Action lue ds fichier */
  2739.     char            *    pS_nomDataPage = NULL;
  2740.     char            *    piBsz_Comment;                                        
  2741.     DATAUNION        data_ptr;
  2742.     /* PROVISOIRE: Type de donn‚es stock‚es dans datapage: */
  2743.     DATATYPE            DataType = (n_fileType == FS_DATAS) ? DTYP_DATAS : DTYP_TEXTS;
  2744.  
  2745.     /*
  2746.      * Teste pr‚sence des noms de fichiers: 
  2747.      */
  2748.     if( ffind( fstream, pS_section ) != NULL )
  2749.     {    /*
  2750.          * On se place dans le dossier ou sont sauv‚s les fichiers:
  2751.          */
  2752.  
  2753.         strcpy( G_tmp_buffer, cpsz_FileName );
  2754.         erase_extension( G_tmp_buffer );
  2755.         if( chdir( G_tmp_buffer ) != 0 )
  2756.         {    /*
  2757.              * Impossible d'ouvrir le dossier:
  2758.              */
  2759.             alert( DISK_CANTENTERDIR );
  2760.             return    FALSE0;        /* Chargement … ‚chou‚ */
  2761.         }
  2762.  
  2763.         while( !( feof( fstream ) ) )
  2764.         {    /*
  2765.              * Tant qu'il y a qque chose … charger: 
  2766.              * Essaie de charger une instr (nom de fichier): 
  2767.              */
  2768.             instr = get_config_line( fstream, ' ', &pS_nomDataPage, &piBsz_Comment );
  2769.  
  2770.             /*
  2771.              * Teste instr: 
  2772.              */
  2773.             if( instr != NULL )
  2774.             {    /*
  2775.                  * S'il y a une instruction:
  2776.                  */
  2777.  
  2778.                 if( strcmp( instr, pS_instruct ) == 0 )
  2779.                 {    /* 
  2780.                      * S'il faut charger une datapage: 
  2781.                      * Nom de la datapage: 
  2782.                      */
  2783.                     pS_nomDataPage = STRDUP( pS_nomDataPage );        /* Duplique nom */
  2784.                 
  2785.                     /*
  2786.                      * Regarde s'il y a un commentaire:
  2787.                      */
  2788.                     if( piBsz_Comment != NULL )
  2789.                     {
  2790.                         char * piBc_Exclamation = strchr( piBsz_Comment, '!' );
  2791.                         
  2792.                         if( piBc_Exclamation == NULL )
  2793.                         {
  2794.                             piBsz_Comment = NULL;
  2795.                         }
  2796.                         else
  2797.                         {    /*
  2798.                              * Duplique le commentaire depuis son buffer
  2799.                              */
  2800.                             piBsz_Comment = STRDUP( &piBc_Exclamation[2] );
  2801.                         }
  2802.                     }
  2803.     
  2804.                     /*
  2805.                      * Cr‚e le nom du fichier dans le buffer temporaire: 
  2806.                      */
  2807.                     strcpy( G_tmp_buffer, pS_nomDataPage );    /* Copie partie principale */
  2808.                     
  2809.                     /*
  2810.                      * Ouvre fichier: 
  2811.                      */
  2812.                     datastream = fopen( G_tmp_buffer, "rb" );
  2813.                     if ( datastream == NULL )
  2814.                     {    /*
  2815.                          * Si on a pas pu ouvrir: 
  2816.                          */
  2817.                         alert( errno );
  2818.                     }
  2819.                     else                            
  2820.                     {    /*
  2821.                          * Si on a pu ouvrir le fichier: 
  2822.                          * Charge les donn‚es du fichier: 
  2823.                          */
  2824.                         switch( n_fileType )
  2825.                         {
  2826.                             case    FS_DATAS:
  2827.                                 data_ptr.records = load_datafile( datastream ); 
  2828.                                 break;
  2829.                                 
  2830.                             case    FS_TEXTES:
  2831.                                 data_ptr.dataBlock = load_DataBlock( datastream, FEMODE_SINGLE );
  2832.                                 break;
  2833.  
  2834.                             default:
  2835.                                 data_ptr.x = NULL;
  2836.                                 signale( "Ne sait pas charger!" );
  2837.                         }
  2838.  
  2839.                         /*
  2840.                          * Stockage des donn‚es charg‚es dans une DATAPAGE:
  2841.                          */
  2842.                         if( data_ptr.x == NULL )
  2843.                         {
  2844.                             free_String( piBsz_Comment );
  2845.                         }
  2846.                         else
  2847.                         {    /*
  2848.                              * Cr‚e zone d'info DATAPAGE standard: 
  2849.                              */
  2850.                             curr_page = create_std_datapage( DataType, pS_nomDataPage );
  2851.  
  2852.                             /*
  2853.                              * M‚morise commentaire:
  2854.                              */
  2855.                             curr_page -> comment = piBsz_Comment;
  2856.  
  2857.                             /*
  2858.                              * Fixe ptr sur les infos des enregistrements: 
  2859.                              * -------------------------------------------
  2860.                              */
  2861.                             curr_page -> data = data_ptr;
  2862.  
  2863.                             /*
  2864.                              * fixe la page comme charg‚e (mais non modifi‚e)
  2865.                              */
  2866.                             dataPage_setSavState( curr_page, SSTATE_SAVED );
  2867.                                 
  2868.             
  2869.                             /* 
  2870.                              * Lien avec le DataDir: 
  2871.                              */
  2872.                             attach_new_data( datadir, curr_page );
  2873.                 
  2874.                             /* 
  2875.                              * OK, la page est charg‚e, on peut passer … la suivante 
  2876.                              */
  2877.                             nb_dataPages ++;                    /* 1 page de + */
  2878.  
  2879.                         }
  2880.  
  2881.                         /* 
  2882.                          * Ferme le fichier: 
  2883.                          */
  2884.                         fclose( datastream );
  2885.                     }
  2886.  
  2887.                     /* 
  2888.                      * LibŠre m‚moire occup‚e par nom: 
  2889.                      */
  2890.                     free_String( pS_nomDataPage );
  2891.                 
  2892.                 }
  2893.                 else 
  2894.                 {    /*
  2895.                       * Si ce n'est pas un commentaire: 
  2896.                       */
  2897.                     signale( "Instruction inconnue " );
  2898.                 }
  2899.             }
  2900.         }
  2901.  
  2902.         /* 
  2903.          * Chargement OK: 
  2904.          */
  2905.         return    OK1;
  2906.     }
  2907.  
  2908.     return    FALSE0;    /* Chargement … ‚chou‚ */
  2909. }
  2910.  
  2911.  
  2912. /*
  2913.  * ------------------------- DATAS ----------------------------
  2914.  */
  2915.  
  2916.  
  2917. /*
  2918.  * save_datas(-)
  2919.  *
  2920.  * Purpose:
  2921.  * --------
  2922.  * Sauvegarde d'un dossier de bases de donn‚es
  2923.  *
  2924.  * History:
  2925.  * --------
  2926.  * 1993: fplanque: Created
  2927.  * 14.12.94: Ne sauve que les bases ayant ‚t‚ modifi‚es
  2928.  * 14.12.94: sauve commentaires, ne rajoute plus d'extension par d‚faut
  2929.  */
  2930. int    save_datas( 
  2931.             FILE             *    fstream, 
  2932.             const char    *    cpsz_FileName,
  2933.             DATADIR        *    pDataDir )
  2934. {
  2935.     /* 
  2936.      * Sauve header: 
  2937.      */
  2938.     fputs( "Filename: DATAS.STU\r\nContent : Bases de donn‚es\r\n", fstream );
  2939.     fputs( M_header, fstream );
  2940.  
  2941.     /*
  2942.      * Sauve bases: 
  2943.      */
  2944.     fputs( "\r\n[ Noms des bases de donn‚es utilis‚es par le serveur: ]\r\n\r\nBASES:\r\n", fstream );
  2945.  
  2946.     return    save_datagroup( fstream, cpsz_FileName, "BASE", FS_DATAS, pDataDir );    
  2947. }
  2948.  
  2949.  
  2950. /*
  2951.  * save_CompRecToDXF(-)
  2952.  *
  2953.  * Sauve un comp rec dans un fichier DXF
  2954.  *
  2955.  * 13.02.95: fplanque: created
  2956.  */
  2957. BOOL    save_CompRecToDXF(                    /* Out: TRUE si success */
  2958.             FILE                *    fstream,     /* In:  Fichier ds lequel on doit sauver */
  2959.             COMPACT_RECORD    *    pCompRec )    /* In:  Record … sauver */
  2960. {
  2961.     /* 
  2962.      * D‚termine longueur de l'enregistrement en cours de traitement: 
  2963.      */
  2964.     size_t    rec_length = pCompRec -> data.header .header .rec_length;
  2965.  
  2966.     /*
  2967.      * Sauve l'enregistrement dans le fichier: 
  2968.      */
  2969.     if( fwrite( pCompRec -> data.compact_rec, 1, rec_length, fstream ) != rec_length )
  2970.     {    /*
  2971.          * Erreur lors de la sauvegarde:
  2972.          */
  2973.         return    FALSE0;
  2974.     }
  2975.  
  2976.     return    TRUE_1;
  2977. }
  2978.  
  2979.  
  2980. /*
  2981.  * Append_CompRecToDXFFile(-)
  2982.  *
  2983.  * Purpose:
  2984.  * --------
  2985.  * Ajoute un compact record a un fichier DXF:
  2986.  *
  2987.  * Purpose:
  2988.  * --------
  2989.  * 13.02.95: fplanque: Created
  2990.  */
  2991. BOOL    Append_CompRecToDXFFile(            /* In: True si success */
  2992.             COMPACT_RECORD *    pCompactRec )    /* In: Ptr sur le Record … ajouter */
  2993. {
  2994.     FILE * fstream;
  2995.     BOOL    result;
  2996.  
  2997.     /*
  2998.      * On se place dans le dossier concern‚: 
  2999.      */
  3000.     Dsetdrv( G_filepath[0] - 'A' );    /* Ch drive */
  3001.     chdir( G_filepath );                    /* Ch dir */
  3002.  
  3003.     /*
  3004.      * Ouvre le fichier en mode APPEND:
  3005.      */
  3006.     fstream = fopen( G_filename, "ab" );
  3007.     if( fstream == NULL )
  3008.     {    /*
  3009.          * Si on a pas pu ouvrir:
  3010.          */
  3011.         TRACE0("fopen() failed");
  3012.         return    FALSE0;
  3013.     }
  3014.  
  3015.     /*
  3016.      * Ajoute le compact record:
  3017.      */
  3018.     result = save_CompRecToDXF( fstream, pCompactRec );
  3019.     if( result == FALSE0 )
  3020.     {
  3021.         TRACE0("save_CompRecToDXF() failed");
  3022.     }
  3023.  
  3024.     /*
  3025.      * Ferme le fichier:
  3026.      */
  3027.     if( fclose( fstream ) != 0 )
  3028.     {
  3029.         TRACE0("fclose() failed");
  3030.         return    FALSE0;
  3031.     }
  3032.  
  3033.     return    result;
  3034. }
  3035.  
  3036.             
  3037.  
  3038. /*
  3039.  * save_DBtoDXF(-)
  3040.  *
  3041.  * Purpose:
  3042.  * --------
  3043.  * Sauvegarde d'une bases de donn‚es dans un fichier
  3044.  *
  3045.  * Notes:
  3046.  * ------
  3047.  * Ne v‚rifie pas les LOCKS sur les records sauv‚s.
  3048.  *
  3049.  * History:
  3050.  * --------
  3051.  * 1993: fplanque: Created
  3052.  * 29.07.94: error code return
  3053.  * 20.10.94: ne sauve plus commentaire
  3054.  */
  3055. int    save_DBtoDXF(                         /* Out: !=0 si erreur */
  3056.             FILE        *    fstream,         /* In:  Fichier ds lequel on doit sauver */
  3057.             char         *    generic_name,     /* In:  Nom sous lequel on sauve: juste pour le header */
  3058.             DATAPAGE *    datapage )        /* In:  DATAPAGE encapsulant la base de donn‚es … sauver */
  3059. {
  3060.     /*
  3061.      * Pointeurs: 
  3062.      */
  3063.     DATA_RECORDS    *    records = datapage -> data.records;        /* Infos sur les enregistrements */
  3064.     COMPACT_RECORD    *    curr_record = records -> first_record;    /* Ptr sur enregistrement en cours de traitement */
  3065.  
  3066.     /*
  3067.      * Sauve header: 
  3068.      */
  3069.     fputs( "Filename: ", fstream );
  3070.     fputs( generic_name, fstream );        /* Nom du fichier */
  3071.     fputs( "\r\nContent : Donn‚es DXF\r\n", fstream );
  3072.     fputs( M_header, fstream );
  3073.  
  3074.     /*
  3075.      * Sauve enregistrements: 
  3076.      */
  3077.     while( curr_record != NULL )
  3078.     {    /* 
  3079.          * Tant qu'il y a un enregistrement … sauver:
  3080.          */
  3081.         if( save_CompRecToDXF( fstream, curr_record ) == FALSE0 )
  3082.         {
  3083.             return    ERROR_1;
  3084.         }
  3085.  
  3086.         /*
  3087.          * Passe … l'enregistrement suivant: 
  3088.          */
  3089.         curr_record = curr_record -> next;
  3090.  
  3091.     }
  3092.     
  3093.     return    SUCCESS0;
  3094. }
  3095.  
  3096.  
  3097.  
  3098. /*
  3099.  * load_datas(-)
  3100.  *
  3101.  * Purpose:
  3102.  * --------
  3103.  * Chargement d'un fichier de bases de donn‚es 
  3104.  * dansun DATADIR
  3105.  *
  3106.  * History:
  3107.  * --------
  3108.  * 1993: fplanque: Created
  3109.  * 19.06.94: sorti code de chargement commun … tous les datagroups g‚n‚raux
  3110.  * 22.01.95: gŠre no de version
  3111.  */
  3112. int    load_datas( 
  3113.             FILE             *    fstream,         /* In: Fichier depuis lequel on charge */
  3114.             const char    *    cpsz_FileName,    /* In: Nom du fichier catalogue -> dossier de sauvegarde des fichiers ind‚pendants */
  3115.             DATADIR        *    datadir )        /* In: dossier dans lequel on charge */
  3116. {
  3117.     /* 
  3118.      * Contr“le le header:
  3119.      */
  3120.     int n_Version = head_control( fstream, FS_DATAS, "Bases de donn‚es" );
  3121.     
  3122.     /*
  3123.      * Contr“le le no de version:
  3124.      */
  3125.     switch( n_Version )
  3126.     {
  3127.         case    0x0000:
  3128.             break;
  3129.             
  3130.         case    ERROR_1:
  3131.             return    FALSE0;    /* Chargement … ‚chou‚ */
  3132.  
  3133.         default:
  3134.             alert( BAD_VERSION );
  3135.             return    FALSE0;    /* Chargement … ‚chou‚ */
  3136.     }
  3137.         
  3138.     return    load_datagroup( fstream, cpsz_FileName, "BASES:", "BASE",
  3139.                                              FS_DATAS ,datadir );
  3140. }
  3141.  
  3142.  
  3143.  
  3144. /*
  3145.  * load_datafile(-)
  3146.  *
  3147.  * Purpose:
  3148.  * --------
  3149.  * Chargement d'un fichier de bases de donn‚es
  3150.  *
  3151.  * Algorythm:
  3152.  * ----------  
  3153.  * Pour chaque record charg‚, met le nbre de locks … 0.
  3154.  *
  3155.  * Suggest:
  3156.  * --------
  3157.  * PROVISOIRE: En cas d'‚chec en cours de chargement 
  3158.  * on perdra de la m‚moire (celle oqp par les enregistrement 
  3159.  * ayant r‚ussi)
  3160.  *
  3161.  * History:
  3162.  * --------
  3163.  * fplanque: Created
  3164.  * 17.05.94: fplanque: clear_AllLocks() pour chaque record charg‚
  3165.  * 19.06.94: fplanque: retourne maintenant un ptr sur DATA_RECORDS
  3166.  * 20.10.94: ne charge plus commentaire
  3167.  * 03.02.95: chang‚ format d'appel … fread()
  3168.  * 02.03.95: appel de CompRec_Create(), correction bug malloc
  3169.  */
  3170. DATA_RECORDS *    load_datafile(
  3171.                         FILE *fstream )
  3172. {
  3173.     /*
  3174.      * Pointeurs: 
  3175.      */
  3176.     COMPACT_HEADER    *        header = (COMPACT_HEADER *) G_tmp_buffer;        /* Zone de chargement du header compact */
  3177.     COMPACT_RECORD    *        curr_record;            /* Enreg en cours de chargement */
  3178.     COMPACT_RECORD    *        prev_record = NULL;    /* Pr‚c‚dent enregitsrement */
  3179.     COMPACT_RECORD    * *    prev_ptrto_next;    /* Pointeur sur suivant ds enreg pr‚c‚dent */
  3180.     /*
  3181.      * Variables: 
  3182.      */
  3183.     DATA_RECORDS    *    p_DataRecords;        
  3184.     size_t                record_length;        /* Longueur de l'enregistrement courant */
  3185.     size_t                resultat;
  3186.     unsigned long        nb_records = 0;    /* Nombre d'enregistrements charg‚s */
  3187.  
  3188.     /* 
  3189.      * Contr“le le header:
  3190.      */
  3191.     int n_Version = head_control( fstream, FS_DXF, "Donn‚es DXF" );
  3192.     
  3193.     /*
  3194.      * Contr“le le no de version:
  3195.      */
  3196.     switch( n_Version )
  3197.     {
  3198.         case    0x0000:
  3199.             break;
  3200.             
  3201.         case    ERROR_1:
  3202.             /*
  3203.              * Chargement … ‚chou‚ dans le header:
  3204.              */
  3205.             return    NULL;
  3206.  
  3207.         default:
  3208.             /*
  3209.              * Chargement a ‚chou‚ 
  3210.              */
  3211.             alert( BAD_VERSION );
  3212.             return    NULL;    
  3213.     }
  3214.  
  3215.  
  3216.     /*
  3217.      * Si le header est correct: 
  3218.      * Cr‚e une zone d'info sur les enregistrements de la base: 
  3219.      */
  3220.     p_DataRecords = (DATA_RECORDS *) MALLOC( sizeof( DATA_RECORDS ) );
  3221.     /*
  3222.      * Adresse du 1er pointeur sur record: 
  3223.      */
  3224.     prev_ptrto_next = &( p_DataRecords -> first_record);
  3225.  
  3226.     /*
  3227.      * Chargement des enregistrements: 
  3228.      */
  3229.     while
  3230.     (    /*
  3231.          * Tente de charger un header: 
  3232.          */
  3233.         resultat = fread( header, 1, sizeof(COMPACT_HEADER), fstream ),
  3234.         resultat != 0
  3235.     )
  3236.     {    /* 
  3237.          * Tant qu'on est pas arriv‚ … la fin du fichier: 
  3238.          * V‚rifie qu'on a affaire … un header: 
  3239.          */
  3240.         if( resultat == sizeof(COMPACT_HEADER)
  3241.                 && header -> head_id == 'HEAD' )
  3242.         {
  3243.             /*
  3244.              * Longueur de l'enregistrement: 
  3245.              */
  3246.             record_length = header -> header .rec_length;
  3247.             /* printf( "\nReclen= %d ", record_length ); */
  3248.  
  3249.             /*
  3250.              * Contr“le la validit‚ de la longueur: 
  3251.              */
  3252.             if (     (record_length > sizeof(COMPACT_HEADER) )
  3253.                 &&    (record_length & (~PARITY)) == 0 )    /* longueur doit etre paire */
  3254.             { /*
  3255.                 * Si la longueur semble correcte: 
  3256.                 * Alloue une zone m‚moire pour l'enregistrement: 
  3257.                 */
  3258.                 curr_record = CompRec_Create( record_length );
  3259.                 /*    printf( "M adr=%lX ", curr_record ); */
  3260.  
  3261.                 /*
  3262.                  * Recopie les infos/header d‚j… charg‚es: 
  3263.                  */
  3264.                 curr_record -> data.header = *header;
  3265.  
  3266.                 /*
  3267.                  * Charge la partie restante: 
  3268.                  */
  3269.                 fread (    curr_record -> data.compact_rec + sizeof(COMPACT_HEADER) ,
  3270.                             sizeof(int),
  3271.                             ( record_length - sizeof(COMPACT_HEADER) )/sizeof(int),
  3272.                             fstream );
  3273.  
  3274.  
  3275.                 /* 
  3276.                  * Fixe les pointeurs de liaison: 
  3277.                  */
  3278.                 curr_record -> prev = prev_record;    /* Lien courant -> pr‚c‚dent */
  3279.                 *prev_ptrto_next = curr_record;        /* Lien pr‚c‚dent -> courant */
  3280.  
  3281.                 /*
  3282.                  * L'enregistrement qui vient d'ˆtre charg‚ n'est pas encore de LOCK‚
  3283.                  */
  3284.                 clear_AllLocks( curr_record );
  3285.  
  3286.  
  3287.                 /* 
  3288.                  * On va charger l'enreg suivant: 
  3289.                  */
  3290.                 nb_records ++;                        /* On a charg‚ un enregistrement de + */
  3291.                 prev_record = curr_record;
  3292.                 prev_ptrto_next = &(curr_record -> next);
  3293.             }
  3294.             else
  3295.             {    /* 
  3296.                  * Format de fichier incorrect: 
  3297.                  */
  3298.                 alert( UNEXPECTED_FFMT );    /* Signale problŠme */
  3299.             
  3300.                 return    NULL;    /* Chargement … ‚chou‚ */
  3301.             }
  3302.                                 
  3303.         }
  3304.         else
  3305.         {    /* Format de fichier incorrect: */
  3306.             alert( UNEXPECTED_FFMT );    /* Signale problŠme */
  3307.         
  3308.             return    NULL;    /* Chargement … ‚chou‚ */
  3309.         }
  3310.     }
  3311.  
  3312.     /*
  3313.      * Fixe pointeurs: 
  3314.      */
  3315.     p_DataRecords -> last_record = prev_record;    /* Ptr sur dernier enregistrement */
  3316.     *prev_ptrto_next = NULL;            /* Il n'y a plus d'enregistrement aprŠs */
  3317.     
  3318.     /*
  3319.      * Fixe variables: 
  3320.      */
  3321.     p_DataRecords -> nb_records = nb_records;    /* Nombre d'enregistrements charg‚s */
  3322.  
  3323.     /*
  3324.      * Chargement OK: 
  3325.      */
  3326.     return    p_DataRecords;
  3327. }
  3328.  
  3329.  
  3330.  
  3331. /*
  3332.  *    ------------------------- TEXTES ----------------------------
  3333.  */
  3334.  
  3335.  
  3336. /*
  3337.  * load_textes(-)
  3338.  *
  3339.  * Purpose:
  3340.  * --------
  3341.  * Chargement d'un fichier de textes:
  3342.  *
  3343.  * History:
  3344.  * --------
  3345.  * 19.06.94: fplanque: Created based on load_datas()
  3346.  */
  3347. int    load_textes( 
  3348.             FILE             *    fstream,         /* In: Fichier depuis lequel on charge */
  3349.             const char    *    cpsz_FileName,    /* IN: Nom du fichier catalogue -> dossier de sauvegarde des fichiers ind‚pendants */
  3350.             DATADIR         *    datadir )        /* In: dossier dans lequel on charge */
  3351. {
  3352.     /* 
  3353.      * Contr“le le header:
  3354.      */
  3355.     int n_Version = head_control( fstream, FS_TEXTES, "Textes" );
  3356.     
  3357.     /*
  3358.      * Contr“le le no de version:
  3359.      */
  3360.     switch( n_Version )
  3361.     {
  3362.         case    0x0000:
  3363.             break;
  3364.             
  3365.         case    ERROR_1:
  3366.             /*
  3367.              * Chargement … ‚chou‚ dans le header:
  3368.              */
  3369.             return    FALSE0;
  3370.  
  3371.         default:
  3372.             /*
  3373.              * Chargement a ‚chou‚ 
  3374.              */
  3375.             alert( BAD_VERSION );
  3376.             return    FALSE0;    /* Chargement … ‚chou‚ */
  3377.     }
  3378.  
  3379.     return    load_datagroup( fstream, cpsz_FileName, "TEXTES:", "TEXTE",
  3380.                                              FS_TEXTES ,datadir );
  3381.  
  3382. }
  3383.  
  3384.  
  3385.          
  3386. /*
  3387.  * load_1text(-)
  3388.  *
  3389.  * Purpose:
  3390.  * --------
  3391.  * Chargement d'un texte (ASCII)
  3392.  *
  3393.  * History:
  3394.  * --------
  3395.  * 1993: fplanque: Created
  3396.  * 02.09.94: modifi‚ chargement
  3397.  */
  3398. int    load_1text( 
  3399.             FILE *fstream, 
  3400.             DATADIR *datadir, 
  3401.             char * filename )
  3402. {
  3403.     DATAPAGE        *curr_page;            /* Page en cours de chargement */
  3404.  
  3405.     /*
  3406.      * Cr‚e zone d'info DATAPAGE standard: 
  3407.      */
  3408.     curr_page = create_std_datapage( DTYP_TEXTS, filename );
  3409.     
  3410.     /*
  3411.      * Chargement du texte: 
  3412.      */
  3413.     if( DataPge_LoadStdText( curr_page, fstream ) == SUCCESS0 )
  3414.     {
  3415.         attach_new_data( datadir, curr_page );
  3416.         
  3417.         return    YES1;
  3418.     }
  3419.  
  3420.     /*
  3421.      * Chargement a ‚chou‚:
  3422.      * On efface la page:
  3423.      */    
  3424.     efface_page( curr_page );
  3425.  
  3426.     return    NO0;
  3427. }
  3428.  
  3429.  
  3430.  
  3431. /*
  3432.  * DataPge_LoadStdText(-)
  3433.  *
  3434.  * Purpose:
  3435.  * --------
  3436.  * Charge un fichier de caractŠres standard
  3437.  * dans une DATAPAGE
  3438.  *
  3439.  * History:
  3440.  * --------
  3441.  * 1993: fplanque: Created
  3442.  * 19.06.94: mise en service DATABLOCK
  3443.  * 19.06.94: appelle maintenant load_DataBlock()
  3444.  * 02.09.94: nom: load_std_text() -> DataPge_LoadStdText(), n'insŠre plus ds DATADIR tout seul, ne d‚truit pas non plus la page
  3445.  * 02.09.94: fixe la page comme SSTATE_SAVED
  3446.  */
  3447. int    DataPge_LoadStdText(         /* Out: SUCCESS0 ou ERROR_1 */
  3448.             DATAPAGE    *    pDataPage,    /* In: Datapage ds laquelle il faut charger le texte */
  3449.             FILE         *    fstream )    /* In: Fichier depuis lequel on charge */
  3450. {
  3451.     /*
  3452.      * Charge texte:
  3453.      */
  3454.     DATABLOCK * pDataBlock = load_DataBlock( fstream, FEMODE_SINGLE );
  3455.  
  3456.     if( pDataBlock != NULL )
  3457.     {    /*
  3458.          * Si chargement OK:
  3459.          */
  3460.         pDataPage -> data.dataBlock = pDataBlock;
  3461.  
  3462.         dataPage_setSavState( pDataPage, SSTATE_SAVED );
  3463.  
  3464.         return    SUCCESS0;
  3465.     }
  3466.  
  3467.     return    ERROR_1;
  3468. }
  3469.  
  3470.  
  3471. /*
  3472.  * save_textes(-)
  3473.  *
  3474.  * Purpose:
  3475.  * --------
  3476.  * Sauvegarde d'un dossier de textes
  3477.  *
  3478.  * History:
  3479.  * --------
  3480.  * 19.06.94: fplanque: Created based on save_datas()
  3481.  * 14.12.94: Ne sauve que les textes ayant ‚t‚ modifi‚es
  3482.  * 14.12.94: sauve commentaires, ne rajoute plus d'extension par d‚faut
  3483.  */
  3484. int    save_textes(
  3485.             FILE             *    fstream, 
  3486.             const char    *    cpsz_FileName,
  3487.             DATADIR        *    pDataDir )
  3488. {
  3489.     /* 
  3490.      * Sauve header: 
  3491.      */
  3492.     fputs( "Filename: TEXTES.STU\r\nContent : Textes\r\n", fstream );
  3493.     fputs( M_header, fstream );
  3494.  
  3495.     /*
  3496.      * Sauve textes: 
  3497.      */
  3498.     fputs( "\r\n[ Noms des fichiers texte utilis‚es par le serveur: ]\r\n\r\nTEXTES:\r\n", fstream );
  3499.  
  3500.     return    save_datagroup( fstream, cpsz_FileName, "TEXTE", FS_TEXTES, pDataDir );    
  3501. }
  3502.  
  3503.  
  3504.  
  3505.  
  3506.  
  3507.  
  3508. /*
  3509.  * merge_text(-)
  3510.  *
  3511.  * Purpose:
  3512.  * --------
  3513.  * Chargement d'un texte ascii avec formattage direct en m‚moire
  3514.  *
  3515.  * History:
  3516.  * --------
  3517.  * 1993: fplanque: Created
  3518.  */
  3519. int    merge_text( 
  3520.             FILE *fstream, 
  3521.             TEXTLINE * start_line, 
  3522.             TEXTINFO * info_ptr )
  3523. {
  3524.     int    ouverture_ok = 0;
  3525.  
  3526.     #define    BUFF_SIZE    1024*8    /* 8 Ko de buffer chargement */
  3527.  
  3528.     char        *buffer,                 /* Buffer de chargement*/
  3529.                 *buff_ptr,                /* Pointeur dans buffer */
  3530.                 *extline,                /* Chaine extraite */
  3531.                 *ext_ptr,                /* Pointeur ds chaine extraite */
  3532.                 *new_line;                /* Ligne g‚n‚r‚e */
  3533.     int         ext_length;                /* Longueur de la chaine extraite */
  3534.     char        current_car;            /* CaractŠre en cours de traitement */
  3535.     size_t    read_length;            /* Longueur lue */
  3536.     int        i;                            /* Parcourt buffer */
  3537.     int        line_end=0;                /* Indique une fin de ligne */
  3538.     TEXTLINE    *text_ptr=start_line;    /* Fin du texte dans lequel on charge */
  3539.  
  3540.     buffer     = (char *) MALLOC( BUFF_SIZE );        /* Alloue 4 Ko de buffer */ 
  3541.     extline    = (char *) MALLOC( G_def_text_width + 1 );    /* Alloue une ligne pour extraire */
  3542.     ext_ptr    = extline;
  3543.     ext_length = 0;            /* Chaine de longueur nulle */
  3544.  
  3545.     while
  3546.     (    /*
  3547.          * Remplissage du buffer lecture: 
  3548.          */
  3549.         read_length = fread ( buffer, 1, BUFF_SIZE, fstream ),
  3550.         read_length != 0
  3551.     )    
  3552.     {    /*
  3553.          * Tant que la fin du fichier n'est pas atteinte: 
  3554.          */
  3555.         if ( read_length == -1 )    /* Si erreur */
  3556.         {
  3557.             alert( errno );                /* Signale erreur */
  3558.             break;
  3559.         }
  3560.  
  3561.         buff_ptr     = buffer;        /* On commence au d‚but du buffer */
  3562.  
  3563.         for ( i = 1;    i <= read_length;    i++, buff_ptr++ )
  3564.         {
  3565.             current_car = *buff_ptr;        /* CaractŠre en cours */
  3566.  
  3567.             /*
  3568.              * D‚tection de la fin d'une ligne 
  3569.              */
  3570.             if (    current_car==10                /* Si FF */
  3571.                     &&    ext_length                    /* et si il y a d‚j… qque chose ds buff d'extraction */
  3572.                     && *( ext_ptr -1 ) == 13)    /* et si le FF vient aprŠs un CR */
  3573.             {
  3574.                 line_end = 1;            /* On arrive sur une fin de ligne */
  3575.                 ext_ptr--;                /* on va Ecraser le CR */
  3576.             }
  3577.  
  3578.             /* 
  3579.              * Extraction des caractŠres:
  3580.              */                    
  3581.             if (    !line_end                     /* Si pas fin de ligne */
  3582.                 &&    current_car != 0 )        /* Si pas un code NUL */
  3583.             {
  3584.                 *ext_ptr++ = current_car;        /* Stocke caractŠre */
  3585.                 ext_length++ ;
  3586.             }
  3587.  
  3588.             /*
  3589.              * Fin d'une ligne extraite: 
  3590.              */
  3591.             if ( line_end                            /* Si fin de ligne */
  3592.                 ||    ext_length == G_def_text_width)     /* ou long max atteinte */
  3593.             {
  3594.                 /*
  3595.                  * Termine la chaine courante: 
  3596.                  */
  3597.                 *ext_ptr = '\0';                    /* Ajoute un NUL */
  3598.                 ext_length++ ;                        /* Longueur augmente */
  3599.  
  3600.                 /*
  3601.                  * Cr‚e une nouvelle ligne: 
  3602.                  */
  3603.                 new_line = (char *) MALLOC( ext_length );     /* R‚serve RAM */
  3604.                 strcpy( new_line, extline );                        /* Copie texte */
  3605.                 text_ptr = insert_line( text_ptr, new_line, NIL, info_ptr );    /* Ajoute la ligne au texte */
  3606.  
  3607.                 /*
  3608.                  * Reset ligne en cours d'extraction: 
  3609.                  */
  3610.                 line_end = 0;                /* On est plus en fin de ligne */
  3611.                 ext_ptr    = extline;        /* Ptr sur d‚but du buffer */
  3612.                 ext_length = 0;            /* Chaine de longueur nulle pour l'instant */
  3613.             }
  3614.         }
  3615.         if ( read_length < BUFF_SIZE )    /* Si on a lu la fin du fichier */
  3616.             break;
  3617.     }
  3618.  
  3619.     if    ( ext_length )                /* S'il reste une ligne non sauv‚e */
  3620.     {
  3621.         /*
  3622.          * Termine la chaine courante: 
  3623.          */
  3624.         *ext_ptr = '\0';                    /* Ajoute un NUL */
  3625.         ext_length++ ;                        /* Longueur augmente */
  3626.  
  3627.         /*
  3628.          * Cr‚e une nouvelle ligne: 
  3629.          */
  3630.         new_line = (char *) MALLOC( ext_length );     /* R‚serve RAM */
  3631.         strcpy( new_line, extline );                        /* Copie texte */
  3632.         text_ptr = insert_line( text_ptr, new_line, NIL, info_ptr );    /* Ajoute la ligne au texte */
  3633.     }
  3634.     FREE( buffer );                /* Efface buffer */
  3635.     FREE( extline );                /* Efface buffer d'extraction */
  3636.  
  3637.     ouverture_ok = 1;
  3638.     
  3639.     return    ouverture_ok;
  3640. }
  3641.  
  3642.  
  3643.  
  3644.  
  3645. /*
  3646.  * save_text(-)
  3647.  *
  3648.  * Purpose:
  3649.  * --------
  3650.  * Sauvegarde d'un texte ascii r‚sident en m‚moire sous forme formatt‚e
  3651.  *
  3652.  * Suggest:
  3653.  * --------
  3654.  * Pas de crlf sur derniŠre ligne!
  3655.  *
  3656.  * History:
  3657.  * --------
  3658.  * 31.05.94: fplanque: Created
  3659.  */
  3660. void    save_text( 
  3661.             FILE         *    fstream,     /* In: Fichier ds lequel on veut sauver */
  3662.             TEXTINFO *    info_ptr )    /* In: Ptr sur le texte … sauver */
  3663. {
  3664.     /*
  3665.      * On commence sur la ligne no 1 (et pas la 0):
  3666.      */
  3667.     TEXTLINE *    pTextLine = (info_ptr -> firstline) -> next;
  3668.  
  3669.     while( pTextLine != NULL )
  3670.     {
  3671.         if( pTextLine -> text != NULL )
  3672.         {
  3673.             fputs( pTextLine -> text, fstream );    /* Ligne de texte */
  3674.         }
  3675.         fputs( G_crlf, fstream );                        /* CR LF */
  3676.  
  3677.         pTextLine = pTextLine -> next;
  3678.     }
  3679. }
  3680.  
  3681.  
  3682.  
  3683. /*
  3684.  * --------------------------- PAGES ECRAN -------------------------------
  3685.  *
  3686.  * Les pages ecran sont parfois trait‚es comme des 'blocs'
  3687.  */
  3688.  
  3689.  
  3690. /*
  3691.  * load_PagesEcran(-)
  3692.  *
  3693.  * Purpose:
  3694.  * --------
  3695.  * Chargement d'un fichier de pages ‚cran 
  3696.  * en Smart Format
  3697.  * dans un DATADIR
  3698.  *
  3699.  * Suggest:
  3700.  * ------
  3701.  * appeller plutot un truc genre: dataDir_InsertStdDataPg() mais pas Std au lieu de attach_new_data()
  3702.  *
  3703.  * History:
  3704.  * --------
  3705.  * 02.09.94: fplanque: Created based on load_arbo()
  3706.  * 15.09.94: corrig‚ type de fichier ds head_control, extension chgt anciens fichiers
  3707.  * 20.09.94: corrig‚ bug type de page
  3708.  * 21.01.95: gŠre no de version
  3709.  */
  3710. int    load_PagesEcran(                         /* Out: */
  3711.                     FILE         *    fstream,        /* In: Fichier depuis lequel on charge */
  3712.                     DATADIR    *    pDataDir )    /* In: Dossier dans lequel on doit charger */
  3713. {
  3714.     /* 
  3715.      * Contr“le le header:
  3716.      */
  3717.     int n_Version = head_control( fstream, FS_PAGES_ECRAN, "Pages-Ecran" );
  3718.     
  3719.     /*
  3720.      * Contr“le le no de version:
  3721.      */
  3722.     switch( n_Version )
  3723.     {
  3724.         case    0x0000:
  3725.             break;
  3726.             
  3727.         case    ERROR_1:
  3728.             /*
  3729.              * Chargement … ‚chou‚ dans le header:
  3730.              */
  3731.             return    NO0;
  3732.  
  3733.         case    CHANGE_2:
  3734.             /* 
  3735.              * Si le header est incorrect:
  3736.              * On revient au d‚but du fichier et
  3737.              * Essaie de charger le fichier comme s'il avait ‚t‚ cr‚‚ avec STUT 2.3
  3738.              */
  3739.             if( alert( QUERY_VDTFORMAT ) == 2 )
  3740.             {    /*
  3741.                  * Ce n'est pas un stut 2.3 … 2.6
  3742.                  */
  3743.                 return    NO0;
  3744.             }
  3745.  
  3746.             graf_mouse( BUSYBEE, NULL );
  3747.  
  3748.             /*
  3749.              * Revient au d‚but du fichier:
  3750.              */            
  3751.             fseek( fstream, 0, SEEK_SET );
  3752.     
  3753.             return    load_pages( fstream, pDataDir );         
  3754.  
  3755.         default:
  3756.             /*
  3757.              * Chargement a ‚chou‚ 
  3758.              */
  3759.             alert( BAD_VERSION );
  3760.             return    NO0;    /* Chargement … ‚chou‚ */
  3761.     }
  3762.  
  3763.     /*
  3764.      * Si header est correct (OK1):
  3765.      */
  3766.  
  3767.     if( ffind( fstream, "PAGES:" ) != NULL )
  3768.     {    /*
  3769.          * Si on a trouv‚ les pages:
  3770.          * Chargement des pages: 
  3771.          */
  3772.         char                ctrl_car;
  3773.         DATAPAGE        *    pDataPage;
  3774.         DATABLOCK    *    pDataBlock;
  3775.  
  3776.         while(    ctrl_car = getc( fstream ),
  3777.                      ctrl_car    == '>' )
  3778.         {    /*
  3779.              * Tant qu'il reste une page … charger:
  3780.              * Charge nom: 
  3781.              */
  3782.             load_str_tobuffer( fstream, 12 );        /* 12 car max */
  3783.  
  3784.             /* 
  3785.              * Cr‚e page: 
  3786.              */
  3787.             pDataPage = create_std_datapage( DTYP_PAGES, G_tmp_buffer );
  3788.  
  3789.             /*
  3790.              * Charge commentaire: 
  3791.              */
  3792.             pDataPage -> comment = load_String( fstream );
  3793.             
  3794.             /*
  3795.              * Chargement des donn‚es: 
  3796.              */
  3797.             pDataBlock = load_DataBlock( fstream, FEMODE_INTEGRATED );
  3798.  
  3799.             if( pDataBlock == NULL )
  3800.             {    /*
  3801.                  * Arrˆte le Chargement:
  3802.                  * Par contre on dit OK, pour les autres pages d‚j… charg‚es:!
  3803.                  */
  3804.                 efface_page( pDataPage );                    
  3805.  
  3806.                 return    YES1;
  3807.             }
  3808.  
  3809.             pDataPage -> data.dataBlock = pDataBlock;
  3810.  
  3811.             /*
  3812.              * Init statut sauvegarde: sauv‚e
  3813.              * Pas de redraw, car page pas encore ajout‚e ds DATAGROUP
  3814.              */
  3815.             dataPage_setSavState( pDataPage, SSTATE_SAVED );
  3816.  
  3817.             /*
  3818.              * InsŠre page dans datadir:
  3819.              */
  3820.             attach_new_data( pDataDir, pDataPage );
  3821.  
  3822.         }
  3823.     }
  3824.  
  3825.     /*
  3826.      * Chargement OK:
  3827.      */
  3828.     return YES1;            
  3829. }
  3830.  
  3831.  
  3832.  
  3833. /*
  3834.  * load_pages(-)
  3835.  *
  3836.  * Purpose:
  3837.  * --------
  3838.  * Chargement d'un fichier de pages ‚cran
  3839.  * au format STUT ONE 2.3
  3840.  *
  3841.  * History:
  3842.  * --------
  3843.  * 1993: fplanque: Created
  3844.  * 19.06.94: mise en service DATABLOCK
  3845.  * 11.08.94: met les pages charg‚es en SSTATE_SAVED
  3846.  * 02.09.94: ajoute ".VDT" aux noms des pages
  3847.  * 31.01.95: fixe ptr sur datadir
  3848.  */
  3849. int    load_pages( 
  3850.             FILE         *    fstream, 
  3851.             DATADIR    *    datadir )
  3852. {
  3853.     int            ouverture_ok = 1;
  3854.     int            nb_pages;                /* Nombre de pages ds le fichier */
  3855.     int            i;
  3856.     DATAPAGE    *    curr_page;                /* Page en cours de chargement */
  3857.     DATAPAGE    *    last_page;                /* Adr de la Page qui vient d'ˆtre charg‚e */
  3858.     DATAPAGE    **    last_nextptr;            /* Pointeur de la page pr‚c‚dente vers la page courante */
  3859.     DATABLOCK * pDataBlock;                /* Ptr sur infos sur block de donn‚es */
  3860.     char        *    ptr;                        /* Pointeur dans la zone de chargement courante */
  3861.     unsigned        length;                    /* Long de la page courante */
  3862.     char            ctrl;                        /* Octet de contr“le */
  3863.  
  3864.     /*
  3865.      * Nombre de pages: 
  3866.      */
  3867.     fread ( &nb_pages, sizeof( nb_pages ), 1, fstream ); /* Charge nombre de pages */
  3868.  
  3869.     /*
  3870.      * Adr du ptr sur la premiŠre page qui va ˆtre charg‚e: 
  3871.      */
  3872.     if( datadir -> nb_elts == 0)
  3873.     {    /*
  3874.          * S'il n'y a pas encore de page en m‚moire: 
  3875.          */
  3876.         last_page = NULL;            /* Il n'y a encore aucune page de charg‚e */
  3877.         if ( datadir -> data_start == NULL)
  3878.         {    /*
  3879.              * On va rattacher la 1ERE page: 
  3880.              */
  3881.             last_nextptr = &(datadir -> data_start);
  3882.         }
  3883.         else
  3884.         {
  3885.             ping();                /* ANORMAL! */
  3886.         }
  3887.     }
  3888.     else
  3889.     {    /*
  3890.           * S'il y a d‚j… des pages en m‚moire: 
  3891.           */
  3892.         last_page = datadir -> data_end;    /* Adr de la derniŠre page en m‚moire */
  3893.         if ( datadir -> data_start != NULL  &&  last_page !=NULL )
  3894.         {    /*
  3895.              * On va ajouter les nlles pages … la suite de la derniŠre: 
  3896.              */
  3897.             last_nextptr = &((datadir -> data_end) -> next);
  3898.         }
  3899.         else
  3900.         {
  3901.             ping();                /* ANORMAL! */
  3902.         }
  3903.     }
  3904.  
  3905.  
  3906.     /*
  3907.      * Charge les pages 1 par 1 
  3908.      */
  3909.     for( i=0; i<nb_pages; i++) 
  3910.     {
  3911.         /*
  3912.          * Contr“le:
  3913.          */
  3914.         fread ( &ctrl, sizeof( char ), 1, fstream );     /* Charge octet de contr“le */
  3915.         if ( ctrl != 255 )
  3916.         {
  3917.             ping();
  3918.         }
  3919.         
  3920.         
  3921.         /*
  3922.          * Charge nom: 
  3923.          */
  3924.         load_str_tobuffer( fstream, 8 );
  3925.         /*
  3926.          * Ajoute .VDT:
  3927.          */
  3928.         strcat( G_tmp_buffer, ".VDT" );
  3929.  
  3930.         /*
  3931.          * Cr‚e zone d'info DATAPAGE standard: 
  3932.          */
  3933.         curr_page = create_std_datapage( DTYP_PAGES, G_tmp_buffer );
  3934.         /*
  3935.          * Lien vers la page pr‚c‚dente:
  3936.          */
  3937.         curr_page -> prev = last_page;
  3938.         /*
  3939.          * Lien de la page pr‚c vers la courante: 
  3940.          */
  3941.         *last_nextptr = curr_page;            
  3942.         /*
  3943.          * Dossier auquel appartient la page:
  3944.          */
  3945.         curr_page -> pDataDir = datadir;
  3946.  
  3947.         /*
  3948.          * Cr‚e infos sur block en m‚moire:
  3949.          */
  3950.         pDataBlock = create_stdDataBlock();
  3951.         /*
  3952.          * Le lie … la page:
  3953.          */
  3954.         curr_page -> data.dataBlock = pDataBlock;
  3955.  
  3956.         /*
  3957.          * Charge longueur page: 
  3958.          */
  3959.         fread ( &length, sizeof( int ), 1, fstream ); /* Charge longueur */
  3960.         pDataBlock -> ul_length = length;
  3961.  
  3962.         /*
  3963.          * Charge DATAs de la page: 
  3964.          */
  3965.         if ( length != 0 )
  3966.         {
  3967.             /*
  3968.              * Cr‚e une zone de stockage: 
  3969.              */
  3970.             ptr = (char*) MALLOC( length );
  3971.             pDataBlock -> p_block = ptr;            /* Stocke l'adresse */
  3972.             /*
  3973.              * Charge page: 
  3974.              */
  3975.             fread ( ptr, 1, length, fstream );
  3976.         }
  3977.         
  3978.         /*
  3979.          * La page es maintenant pleine mais sauv‚e:
  3980.          */
  3981.         dataPage_setSavState( curr_page, SSTATE_SAVED );
  3982.         
  3983.         /*
  3984.          * OK, la page est charg‚e, on peut passer … la suivante 
  3985.          */
  3986.         last_page = curr_page;
  3987.         last_nextptr = &(last_page -> next);
  3988.     }
  3989.  
  3990.     /*
  3991.      * Lien de la page pr‚c vers la courante: YENAPLUS! : 
  3992.      */
  3993.     *last_nextptr = NULL;            
  3994.     /*
  3995.      * Pointeur sur la derniŠre page: 
  3996.      */
  3997.     datadir -> data_end = last_page;
  3998.  
  3999.     /*
  4000.      * Stocke nombre de pages effectivement charg‚es: 
  4001.      */
  4002.     (datadir -> nb_elts) += i;    /* Nb de pages charg‚es en PLUS de celles qui existaient d‚j… */
  4003.  
  4004.     return    ouverture_ok;
  4005. }
  4006.  
  4007.  
  4008.  
  4009.  
  4010. /*
  4011.  * save_PagesEcran(-)
  4012.  *
  4013.  * Purpose:
  4014.  * --------
  4015.  * Sauvegarde d'un dossier de pages ‚cran
  4016.  *
  4017.  * History:
  4018.  * --------
  4019.  * 02.09.94: fplanque: Created
  4020.  */
  4021. int    save_PagesEcran(                 /* Out: YES1 si sauvegarde OK */
  4022.             FILE         *    fstream,     /* In:  Fichier ds lequel on doit sauver */
  4023.             DATADIR    *    pDataDir )    /* In:  Dossier de pages ‚cran … sauver */
  4024. {
  4025.     /*
  4026.      * Variables: 
  4027.      */
  4028.     DATAPAGE    *    datapage = pDataDir -> data_start;    /* 1Šre page */
  4029.  
  4030.     /*
  4031.      * Sauve header: 
  4032.      */
  4033.     fputs( "Filename: VIDEOTEX.STU\r\nContent : Pages-Ecran\r\n", fstream );
  4034.     fputs( M_header, fstream );
  4035.  
  4036.     /* 
  4037.      * Sauve pages: 
  4038.      */
  4039.     fputs( "PAGES:\r\n", fstream );
  4040.     while( datapage != NULL )
  4041.     {
  4042.         /* 
  4043.          * Sauve octet de contr“le indiquant le d‚but d'une page: 
  4044.          */
  4045.         putc( '>', fstream );
  4046.  
  4047.         /* 
  4048.          * Sauve nom de la page: 
  4049.          */
  4050.         save_String( datapage -> nom, fstream );    /* Nom */
  4051.     
  4052.         /* 
  4053.          * Sauve commentaire: 
  4054.          */
  4055.         save_String( datapage -> comment, fstream );    /* Commentaire */
  4056.  
  4057.         /* 
  4058.          * Donn‚es de la page vid‚otex: 
  4059.          */
  4060.         if( save_DataBlock( fstream, datapage -> data.dataBlock, FEMODE_INTEGRATED ) == ERROR_1 )
  4061.         {
  4062.             return    NO0;
  4063.         }
  4064.         
  4065.         /*
  4066.          * Passe … la page suivante: 
  4067.          */
  4068.         datapage = datapage -> next;    
  4069.     }
  4070.  
  4071.     /*
  4072.      * Sauve octet de contr“le indiquant qu'il n'y a plus de page: 
  4073.      */
  4074.     putc( 0xFF, fstream );
  4075.  
  4076.     return    YES1;        /* La sauvegarde s'est bien effectu‚e */
  4077. }
  4078.  
  4079.              
  4080.              
  4081.              
  4082. /*
  4083.  * load_1page(-)
  4084.  *
  4085.  * Purpose:
  4086.  * --------
  4087.  * Chargement d'une page ‚cran
  4088.  *
  4089.  * History:
  4090.  * --------
  4091.  * 1993: fplanque: Created
  4092.  */
  4093. int    load_1page( 
  4094.             FILE         *    fstream, 
  4095.             DATADIR     *    datadir, 
  4096.             char         *    filename )
  4097. {
  4098.     DATAPAGE    *curr_page;                /* Page en cours de chargement */
  4099.  
  4100.     /*
  4101.      * Cr‚e zone d'info DATAPAGE standard: 
  4102.      */
  4103.     curr_page = create_std_datapage( DTYP_PAGES, filename );
  4104.  
  4105.     /*
  4106.      * Chargement de la page: 
  4107.      */
  4108.     if( DataPge_LoadStdText( curr_page, fstream ) == SUCCESS0 )
  4109.     {
  4110.         attach_new_data( datadir, curr_page );
  4111.         
  4112.         return    YES1;
  4113.     }
  4114.  
  4115.     /*
  4116.      * Chargement a ‚chou‚:
  4117.      * On efface la page:
  4118.      */    
  4119.     efface_page( curr_page );
  4120.  
  4121.     return    NO0;
  4122.  
  4123. }
  4124.  
  4125.  
  4126. /*
  4127.  * -------------------------- IMAGES -----------------------------
  4128.  */
  4129.  
  4130.  
  4131. /*
  4132.  * load_pi3(-)
  4133.  *
  4134.  * Purpose:
  4135.  * --------
  4136.  * Chargement d'une image Degas Elite
  4137.  *
  4138.  * History:
  4139.  * --------
  4140.  * 1993: fplanque: Created
  4141.  * 19.06.94: fplanque: ne charge plus longueur du fichier! cause: mise en service DATABLOCK
  4142.  * 29.07.94: fplanque: correction bug dans MEMSET: 132 -> 32 octets seulement sont mis … 0
  4143.  */
  4144. int    load_pi3( FILE *fstream, DATADIR *datadir, char * filename )
  4145. {
  4146.     int        ouverture_ok = 1;        /* A priori, on peut charger le fichier */
  4147.     DATAPAGE    *curr_page;                /* Page en cours de chargement */
  4148.     char        *ptr;                        /* Pointeur sur la zone de chargement */
  4149.     unsigned    length;                    /* Longueur charg‚e */
  4150.  
  4151.     /*
  4152.      * Cr‚e zone d'info DATAPAGE standard: 
  4153.      */
  4154.     curr_page = create_std_datapage( DTYP_PICS, filename );
  4155.  
  4156.     /*
  4157.      * Cr‚e une zone de stockage pour DATAs: 
  4158.      */
  4159.     ptr = (char *) MALLOC( sizeof(DEGASPIX) );
  4160.     curr_page -> data.degaspix = (DEGASPIX *) ptr;        /* Stocke l'adresse */
  4161.     if ( ptr == NULL)
  4162.     {
  4163.         alert( NOMEM_OPENDOC );        /* Pas assez de mem pour ouvrir ce doc */
  4164.         ouverture_ok = 0;
  4165.     }
  4166.     else
  4167.     {
  4168.         /*
  4169.          * Charge DATAs de la page: 
  4170.          */
  4171.         length = (unsigned) fread ( ptr, 1, sizeof(DEGASPIX)+1, fstream ); /* Charge 32066+1 octets */
  4172.         if ( length == 32034 )
  4173.         {    /*
  4174.              * Si fichier au format degas PAS ‚lite! 
  4175.              */
  4176.             ptr += 32034;
  4177.             memset( ptr, 0, 32 );    /* Finit de remplir avec des /0 */
  4178.         }
  4179.  
  4180.         if( length != 32034 && length != sizeof(DEGASPIX) ) 
  4181.         {    /*
  4182.              * Si longueur du fichier incorrecte: 
  4183.              */
  4184.             alert( BAD_FILEFMT );    /* Format de fichier non reconnu! */
  4185.             ouverture_ok = 0;            /* Signale erreur */
  4186.         }
  4187.         else
  4188.         {    /*
  4189.              * Relie la nlle image aux autres: 
  4190.              */
  4191.             attach_new_data( datadir, curr_page );
  4192.         }
  4193.     }
  4194.  
  4195.     /*
  4196.      * Si le chargement n'a pas pu s'effectuer: 
  4197.      */
  4198.     if ( ouverture_ok == 0 )
  4199.     {    /*
  4200.           * Si on a pas pu charger:
  4201.           */
  4202.         if ( curr_page -> data.degaspix != NULL )
  4203.         {
  4204.             FREE( curr_page -> data.degaspix );        /* LibŠre zone page */
  4205.         }
  4206.         FREE( curr_page );                    /* LibŠre ref de la page */
  4207.     }
  4208.  
  4209.     return    ouverture_ok;
  4210. }
  4211.          
  4212.          
  4213. /*
  4214.  * write_PIx(-)
  4215.  *
  4216.  * Purpose:
  4217.  * --------
  4218.  * Sauvegarde d'une image Degas Elite
  4219.  *
  4220.  * History:
  4221.  * --------
  4222.  * 29.07.94: fplanque: Created
  4223.  */
  4224. int    write_PIx(                             /* In: !=0 si erreur */
  4225.             FILE         *    fstream,         /* In: Fichier dans lequel on veut sauver */
  4226.             DEGASPIX *    pDegasPix )        /* In: Ptr sur image en m‚moire */
  4227. {
  4228.     size_t    elem_count = sizeof( DEGASPIX );
  4229.  
  4230.     if( fwrite( pDegasPix, 1, elem_count, fstream ) != elem_count )
  4231.     {
  4232.         return    ERROR_1;
  4233.     }
  4234.  
  4235.     return    SUCCESS0;
  4236. }
  4237.  
  4238.  
  4239. /*
  4240.  * ------------------------ ROUTINES GENERALES ---------------------------
  4241.  */
  4242.  
  4243.  
  4244. /*
  4245.  * load_String(-)
  4246.  *
  4247.  * Purpose:
  4248.  * --------
  4249.  * Charge une chaine de caractŠres termin‚e par \0 et la renvoie
  4250.  *
  4251.  * Algorythm:
  4252.  * ----------  
  4253.  * Renvoie NULL si la chaine ‚tait vide
  4254.  *
  4255.  * History:
  4256.  * --------
  4257.  * 24.05.94: fplanque: Created
  4258.  * 14.02.95: verified mallocs
  4259.  */
  4260. char *    load_String(                    /* Out: chaine de caractŠres charg‚e */
  4261.                     FILE *    fstream )    /* In:  fichier depuis lequel on va charger */
  4262. {
  4263.     /*
  4264.      * Charge une chaine dans G_tmp_buffer:
  4265.      */
  4266.     load_str_tobuffer( fstream, 256 );    
  4267.     
  4268.     /*
  4269.      * Teste si cette chaŒne est vide ou non: 
  4270.      */
  4271.     if( *G_tmp_buffer == '\0' )
  4272.     {    /*
  4273.          * ChaŒne vide: 
  4274.          */
  4275.         return NULL;
  4276.     }
  4277.  
  4278.     /*
  4279.      * Duplique juste la longueur n‚cessaire: 
  4280.      */
  4281.     return    STRDUP( G_tmp_buffer );            
  4282.  
  4283. }
  4284.  
  4285.  
  4286.  
  4287. /*
  4288.  * save_String(-)
  4289.  *
  4290.  * Purpose:
  4291.  * --------
  4292.  * Sauve une chaine de caractŠres termin‚e par \0
  4293.  *
  4294.  * History:
  4295.  * --------
  4296.  * 24.05.94: fplanque: Created
  4297.  */
  4298. void    save_String(
  4299.                 char *    pString,        /* In: Pointeur sur la chaŒne … sauver */
  4300.                 FILE *    fstream )    /* In: fichier dans lequel on va sauver */
  4301. {
  4302.     if( pString != NULL )
  4303.     {    /*
  4304.           * S'il y a des caractŠres:
  4305.           */
  4306.         fputs( pString, fstream );        /* ChaŒne de caractŠres */
  4307.     }
  4308.     fputc( 0, fstream );                    /* \0 final */
  4309. }
  4310.  
  4311.  
  4312.  
  4313. /*
  4314.  * load_DataBlock(-)
  4315.  *
  4316.  * Purpose:
  4317.  * --------
  4318.  * Chargement d'un DATABLOCK
  4319.  * exemple: - texte ascii … stocker sous forme COMPACTE
  4320.  *          - page vdt...
  4321.  *
  4322.  * History:
  4323.  * --------
  4324.  * 19.06.94: fplanque: Created
  4325.  * 07.09.94: ajout du paramŠtre FEMODE
  4326.  */
  4327. DATABLOCK *    load_DataBlock(             /* Out: Infos sur block charg‚ */
  4328.                     FILE    *    fstream,        /* In:  Fichier duquel on charge */
  4329.                     FEMODE    FEMode)        /* In:  Mode d'enregistrement ds fichier */
  4330. {
  4331.     /*
  4332.      * Cr‚e zone d'infos sur bloc m‚moire:
  4333.      */
  4334.     DATABLOCK    * pDataBlock = create_stdDataBlock();
  4335.  
  4336.     /*
  4337.      * D‚termine longueur du datablock:
  4338.      */
  4339.     long    l_length = -1;
  4340.     
  4341.     if( FEMode == FEMODE_SINGLE )
  4342.     {    /*
  4343.          * Demande longueur du fichier :
  4344.          */
  4345.         l_length = filelength( fileno( fstream ) );
  4346.     }
  4347.     else
  4348.     {    /*
  4349.          * FEMode == FEMODE_INTEGRATED
  4350.          * Charge longueur ds le fichier mˆme:
  4351.          */ 
  4352.         fread( &l_length, sizeof( long ), 1, fstream );
  4353.     }
  4354.  
  4355.     if( l_length < 0 )
  4356.     {    /*
  4357.           * Impossible de connaitre longueur:
  4358.           */
  4359.         FREE( pDataBlock );
  4360.         return NULL;                /* Chargement a ‚chou‚ */
  4361.     }
  4362.  
  4363.     pDataBlock -> ul_length = l_length;
  4364.  
  4365.     /*
  4366.      * Charge Bloc: 
  4367.      */
  4368.     if( l_length == 0 )
  4369.     {    /*
  4370.          * Chargement OK:
  4371.          */
  4372.         return    pDataBlock;
  4373.     }
  4374.     else
  4375.     {    /*
  4376.          * Cr‚e une zone de stockage: 
  4377.          */
  4378.         char    * p_block = (char*) MALLOC( l_length );
  4379.         pDataBlock -> p_block = p_block;            /* Stocke l'adresse */
  4380.         /*
  4381.          * Charge datas: 
  4382.          */
  4383.         if( fread( p_block, 1, l_length, fstream ) > 0 )
  4384.         {    /*
  4385.              * Chargement OK:
  4386.              */
  4387.             return    pDataBlock;
  4388.         }
  4389.         FREE( p_block );
  4390.     }
  4391.     FREE( pDataBlock );
  4392.  
  4393.     /*
  4394.      * Chargement a ‚chou‚:
  4395.      */
  4396.     return    NULL;
  4397. }
  4398.  
  4399.  
  4400.  
  4401. /*
  4402.  * save_DataBlock(-)
  4403.  *
  4404.  * Purpose:
  4405.  * --------
  4406.  * Sauvegarde d'un DataBlock:
  4407.  * exemples: - texte ascii r‚sident en m‚moire sous forme COMPACTE
  4408.  *           - page vdt...
  4409.  *
  4410.  * History:
  4411.  * --------
  4412.  * 19.06.94: fplanque: Created
  4413.  * 29.07.94: error code return
  4414.  * 07.09.94: gestion de FEMODE_INTEGRATED
  4415.  */
  4416. int    save_DataBlock( 
  4417.             FILE            *    fstream,         /* In: Fichier ds lequel on veut sauver */
  4418.             DATABLOCK    *    pDataBlock,        /* In: Ptr sur le DATABLOCK … sauver */
  4419.             FEMODE            FEMode)            /* In:  Mode d'enregistrement ds fichier */
  4420. {
  4421.     size_t    size_bloc = pDataBlock -> ul_length;
  4422.  
  4423.     if( FEMode == FEMODE_INTEGRATED )
  4424.     {    /*
  4425.          * Si plusieurs datablocks sont sauv‚s dans un mˆme fichier,
  4426.          * il faut sauver la taille du bloc avant:
  4427.          */
  4428.         fwrite( &size_bloc, sizeof( long ), 1, fstream );
  4429.     }
  4430.  
  4431.  
  4432.     if( fwrite( pDataBlock -> p_block, 1, size_bloc, fstream ) != size_bloc )
  4433.     {
  4434.         return    ERROR_1;
  4435.     }
  4436.  
  4437.     return    SUCCESS0;
  4438. }
  4439.  
  4440.  
  4441.